1

1.Spring Security核心功能

Spring Security核心功能有如下几点:

  • 认证(你是谁?)
  • 授权(你能干什么?)
  • 攻击防护(防止伪造身份)

Spring Security开发基于表单认证主要说明:

  1. SpringSecurity基本原理
  2. 实现用户名+密码认证
  3. 实现手机号+短信认证(Spring Security中添加自定义身份认证方式)

2.Spring Security的基本原理

2.1 前言实例

我们做一个表单认证。我们把 认证授权代码都写在spring-security-web模块,然后在spring-security-demo里面去引用:

2.1.1 默认情况下

默认情况下,如果在classpath下有Spring Security相关的jar包的话,SpringBoot会自定为你做一些安全的配置。默认配置如下:

security:  
  basic:  
    enabled: true

我们注释掉应用里面application.yml文件的以上配置。重启服务,然后访问:http://127.0.0.1:8088/user
会弹出默认认证框,我们输入:user/启动项目时的密码,然后就会请求到接口:

47.png

上面是不满足我们企业要求的,如何覆盖掉上面的默认配置,我们使用表单登录。

2.1.2 覆盖默认条件下配置

  1. 定义一个web安全配置类
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * 定义web安全配置类:覆盖config方法
     * 1.参数为HttpSecurity
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         * 定义了任何请求都需要表单认证
         */
       http.formLogin()//表单登录---指定了身份认证方式
          .and()
          .authorizeRequests()//对请求进行授权
          .anyRequest()//任何请求
          .authenticated();//都需要认证
    }
}
  1. web端请求接口:http://127.0.0.1:8088/user;自动会跳转到表单登录页面

48.png

输入用户名/密码之后;跳转到之前的接口请求上去
47.png

  1. 假如我们不想使用表单登录还是想用basic的登录,对应的配置如下:
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * 定义web安全配置类:覆盖config方法
     * 1.参数为HttpSecurity
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         * 定义了任何请求都需要表单认证
         */
       //http.formLogin()//表单登录---指定了身份认证方式
        http.httpBasic()//http的basic登录  
          .and()
          .authorizeRequests()//对请求进行授权
          .anyRequest()//任何请求
          .authenticated();//都需要认证
    }
}

2.2 原理分析

2.2.1原理示意图分析

  1. Spring Security最核心的东西就是过滤器链路,所有请求都会经过Spring Security过滤器链,然后响应也会经过过滤器链返回回去
  2. 这些过滤器在启动时候,SpringBoot会自动把它都配置进去。我们不用去注入到Spring里面去
  3. Spring Security过滤器链最核心的就是以下绿色部分:他的作用就是认证用户身份。每一块代表一个过滤器,每一块都提供了一种认证方式。上面我们讲过使用表单登录和使用http登录,在这里恰好对应Username Password Authentication Filter(校验表单认证)和Basic Authentication Filter(校验http basic登录),绿色过滤器主要是检查请求是否有次过滤器校验的信息。比如:Username Password Authentication Filter会检查请求是不是登录请求,请求中是否带了用户名/密码。如果带了,就会使用用户名/密码检验,没有的话就会放过去下一个过滤器:Basic Authentication Filter校验请求头中是否有Basic开头的信息。有的话就会拿出来进行Base64解码,然后校验登录。任何一个过滤器认证了一个请求之后,会给这个请求做一个标记,表明这个请求认证成功了,下面过滤器放行即可。 4. 所有过滤器执行完毕之后,请求会到一个拦截器(FilterSecurity Interceptor),FilterSecurity Interceptor是Spring Security过滤器链上的最后一环。在他之后使我们自己写的Rest API。我们之前的配置信息都会放到FilterSecurity Interceptor中,让其做最后一个校验。过的话就进入REST API了,不过的话就会根据不能访问的原因抛出对应的异常了,对应的异常在FilterSecurity Interceptor前有一个Exception Translation Filter捕获FilterSecurity Interceptor抛出的异常,根据不同的异常做相应的处理(比如是表单登录的话,会根据需要用户名/密码登录的异常将其引导到表单页面进行输入登录信息)。

49.png

注意:上面过滤器链上,绿色的部分可以我们通过配置来决定某个过滤器是否生效了。比如上面我们不配置http.httpBasic()那么Basic Authentication Filter就不会生效。其他过滤器我们是不能控制的。他们一定会在过滤器链路上,并且其位置也是不能更改的。

2.2.2 原理断电调试

我们在上面的过滤器上及REST API打上断点。

UserController接口打断点:
50.png

FilterSecurityInterceptor断点:
51.png

ExceptionTranslationFilter的doFilter断点:
52.png

UsernamePasswordAuthenticationFilter的attemptAuthentication断点:
53.png

我们页面请求:
http://127.0.0.1:8088/user
首先会进入:
54.png

然后调试会进入:Exception Translation Filter

55.png

然后进入我们登录页面:
输入用户名/密码 点击登录

进入:UsernamePasswordAuthenticationFilter
56.png

然后又进入:FilterSecurity Interceptor
57.png

再下一步进入我们接口逻辑。


startshineye
91 声望26 粉丝

我在规定的时间内,做到了我计划的事情;我自己也变得自信了,对于外界的人跟困难也更加从容了,我已经很强大了。可是如果我在规定时间内,我只有3分钟热度,哎,我不行,我就放弃了,那么这个就是我自己的问题,因为你自己...


引用和评论

0 条评论