不得不知道的Spring Security的基本原理

微信公众号:Java患者

专注Java领域技术分享

前言

        由于我们的API接口,在服务启动后,是在无保护的状态下。任何人只要知道服务的地址,都可以访问我们开发的这些服务。这种情况在我们真实的企业级应用开发中是不允许的。我们需要对用户进行认证和授权,来保证我们合法的用户和有权限的用户才能访问。

        SpringSecurity这个框架就是来做这种事情的,他提供了3个核心的功能:

  • 认证:就是告诉系统你是谁,实际上就是我们常说的登录。

  • 授权:就是指定当前的用户你能什么,不能干什么。

  • 攻击防护:如果黑客通过伪造身份,我们前面的两种操作就无效了的。而SpringSecurity的核心功能,就是它可以有效防止伪造身份。

Spring Security的默认配置

        默认情况下,在项目中有Spring Security相关的jar包。Spring Security会自动帮我们做一些安全的配置。这时候我们访问我们写的服务时候,它会让我们去填用户名和密码。

        用户名是默认的,就是“user”,密码是我们启动时,控制台给我们打印的那一行日志。我们登陆后就可以拿到我们服务的响应了。

        从这个例子中,我们可以看到,在我们不做任何的配置时,Spring Security它把我们所有的访问都给我们保护起来了。这种默认的行为并不能满足我们实际开发的需要,那么我们该如何自定义并覆盖它这种配置?、

第一个表单登录例子

        我们用Spring Security来实现通过表单来登录,并且所有请求都需要授权才能访问的例子。

       首先创建一个继承继承WebSecurityConfigurerAdapter的类,它是Spring Security提供的web安全的适配器类,然后重写configure(HttpSecurity http)方法。

@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // http.httpBasic()  这是之前httpBasic的登录
        // 表单登录(认证)
        http.formLogin()
                .and()
                // 下面的都是对请求进行授权配置
                .authorizeRequests()
                // 是指任何请求
                .anyRequest()
                // 都需要授权
                .authenticated();
    }
}

        这时我们访问之前的服务,会跳到一个表单登录页面:

        用户名还是“user”,密码依然是控制台打印的默认密码。

Spring Security的基本原理

        Spring Security最核心的东西是一个过滤器链,这些过滤器在Spring boot启动的时候会帮我们配置上。

下面是2个常见的认证过滤器:

  • UsernamePasswordAuthenticationFilter:处理表单的认证方式。它会检查你的请求是不是一个登录请求,带不带用户名和密码。如果带,就会尝试认证处理。如果没带,则会把请求给下一个过滤器,让他来处理。

  • BasicAuthenticationFilter:处理Http Basic的认证方式。它会在在HTTP请求头部看到有没有basic的信息。如果有就拿出来并且做Base64解码,取出用户名和密码尝试登录。

        其他过滤器认证处理同理,如果有一个请求认证成功了,他就对请求标记。过滤器链最后一环是FilterSecurityInterceptor,这个过滤器会读取我们的配置,来校验请求有没有权限访问最终的服务。如果不能访问,他会根据其原因来抛出不同的异常,这些异常会被它前面的过滤器ExceptionTranslationFilter捕获到,并且做出相应的处理。比如前面配置了表单登录,它就引导用户去表单登录。

        这就是Spring Security最基本的原理,Spring Security的功能都是建立在这个过滤器链基础上的。需要注意的是,认证的过滤器我们是可以通过配置来控制是否生效的,而其他的过滤器不行。

查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值