SpringSecurity启动源码WebSecurityConfigurerAdapter分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringSecurity启动源码WebSecurityConfigurerAdapter分析相关的知识,希望对你有一定的参考价值。

参考技术A

SpringSecurity启动源码WebSecurityConfigurerAdapter分析

csrf()将CsrfConfigurer实例放到add进AbstractConfiguredSecurityBuilder的configurers(链表)成员变量中,disable()则是将CsrfConfigurer实例从configurers remove出去,在add之前会判断CsrfConfigurer实例是否已经在configurers中,如果有直接返回,没有则创建.这里为啥要disable呢 ,因为我们自定义的规则类的父类WebSecurityConfigurerAdapter的getHttp方法,调用了csrf(),最终会调用configure(H http)方法,将CsrfFilter()添加到过滤器链中.所有添加的Configurer都是先调用int(H http)在调用configure(H http)

5.1 .formLogin ()

赋值AbstractAuthenticationFilterConfigurer成员变量authFilter为UsernamePasswordAuthenticationFilter(),并在调用super方法的时候将AbstractAuthenticationProcessingFilter类的成员变量requiresAuthenticationRequestMatcher为登入路径/login 方法为POST

赋值登入页地址默认为/login

将LoginUserAuthenticationEntryPoint类的全局变量loginFormUrl赋值为/login

5.2 loginPage ("/page/login")方法
将上面赋值为login改为/page/login
5.3 .loginProcessingUrl ("/login/code")

5.4
.successHandler (mySavedRequestAwareAuthenticationSuccessHandler)
.failureHandler (mySimpleUrlAuthenticationFailureHandler)
赋值AbstractAuthenticationFilterConfigurer全局变量successHandler和failureHandler

5.5 .authorizeRequests ()
.antMatchers ("/hello/ ").authenticated ()
.antMatchers ("/nihao/
", "/page/login").permitAll ()
.antMatchers ("/nihao/ ", "/page/login").hasAnyRole ("role","admin")
//.antMatchers("/imgs/
").permitAll().anyRequest ().authenticated ();
将所有的规则都存放到AbstractConfigAttributeRequestMatcherRegistry类的成员变量urlMappings中

//下面的4个处理器下面会分析到,主要作用是登入成功或者失败之后的处理
myAuthenticationSuccessHandler, mySavedRequestAwareAuthenticationSuccessHandler,
myAuthenticationFailureHandler, mySimpleUrlAuthenticationFailureHandler这4个参数都是从IOC容器中获取的
// .successHandler (myAuthenticationSuccessHandler)
.successHandler(mySavedRequestAwareAuthenticationSuccessHandler)
// .failureHandler(myAuthenticationFailureHandler)
.failureHandler(mySimpleUrlAuthenticationFailureHandler)

下面为4个处理器方法,都是从IOC容器中获取

项目有前后端在一个项目里,有前后端分离的,那么怎么保证在登入成功或者失败的时候是返回页面还是返回json串,上面的4个类可以解决这个问题.
下面两个参数只能返回页面
myAuthenticationSuccessHandler
myAuthenticationFailureHandler
下面两个方法可以返回页面,页可以返回json串
mySavedRequestAwareAuthenticationSuccessHandler
mySimpleUrlAuthenticationFailureHandler
在调用successHandler,failureHandler两个方法的时候,为AbstractAuthenticationFilterConfigurer的successHandler和failureHandler两个成员变量赋值.
Security启动源码分析结束,后续的文章分析验证流程.

SpringSecurity——基本原理

一、Spring Security的理解

  • Spring Security最核心的是过滤器链,也就是一组过滤器(Filter),所有的访问服务的请求都会经过spring security的过滤器,服务的响应也会经过spring security的过滤器再返回给客户端,并且这些过滤器在系统启动时springboot会自动都配置完成。

二、Spring Security基本原理

1、Spring Security基本原理图解


2、spring security核心过滤器

(1)、UsernamePasswordAuthenticationFilter过滤器

  • 主要用于处理formLogin表单登录。
  • 先检查请求是否是登录请求,并且检查登录请求中是否带有用户名和密码,
  • 如果有,这个过滤器就会尝试用这个用户名和密码进行登录,
  • 如果没有,就回放过该请求,交给下一个过滤器处理

(2)、BasicAuthenticationFilter过滤器

  • 主要用于处理httpBasic登录
  • 先检查请求头中是否有basic开头Authentication的信息,
  • 如果有,会尝试进行base64解码,然后取出用户名和密码,尝试进行登录
  • 如果没有,就回放过该请求,交给下一个过滤器处理

(3)、ExceptionTranslationFilter过滤器

  • 用于捕获FilterSecurityInterceptor过滤器抛出的异常。
  • ExceptionTranslationFilter 位于FilterSecurityInterceptor过滤器之前的位置。

(4)、FilterSecurityInterceptor过滤器

  • 此过滤器是Spring Security的最后一个 Filter,获取当前 request 对应的权限配置,调用访问控制器进行鉴权操作。
  • 以上任何一个过滤器成功完成登录后,会在请求上做一个标记,标记认证成功,最后会到FilterSecurityInterceptor过滤器
  • FilterSecurityInterceptor是整个spring security过滤器链的最后一环
  • FilterSecurityInterceptor后就是我们自己写的controller控制层的REST服务
  • FilterSecurityInterceptor决定当前的请求能否访问我们写的REST服务

3、FilterSecurityInterceptor依据什么判断当前的请求能否访问我们写的REST服务

  • 根据代码中的配置,即自定义的SecurityConfig配置类中继承WebSecurityConfigurerAdapter类并重写的configure方法中的内容
  • configure方法中的内容最终都会放到FilterSecurityInterceptor过滤器中,判断的结果是通过还是不通过
  • 如果通过,会跳访问我们写的REST服务
  • 如果不通过,会根据具体不能访问的原因抛出对应的异常

4、FilterSecurityInterceptor抛出的异常如何解决

  • 通过ExceptionTranslationFilter过滤器来捕获FilterSecurityInterceptor过滤器抛出的异常。
  • ExceptionTranslationFilter 位于FilterSecurityInterceptor过滤器之前的位置。

5、总结

  • 以上就是spring security最核心的基本原理,spring security提供的所有的功能、特性都是建立在此过滤器链上。
  • 比如微信登录、qq登录、短信验证码登录都是在此过滤器链上添加过滤器,来支持不同的身份认证方式
  • 在程序实际运行时候,过滤器链上的过滤器不止UsernamePasswordAuthenticationFiletr、BasicAuthenticationFilter、ExceptionTranslationFilter、FilterSecurityInterceptor这四种过滤器,还有其他的过滤器。

三、Spring Security源码解析

1、Spring Security过滤器源码

  • UsernamePasswordAuthenticationFilter过滤器源码解析

  • ExceptionTranslationFilter过滤器源码解析

  • FilterSecurityInterceptor过滤器源码解析

2、启动springboot项目,发送请求,查看过滤器执行顺序

  • 创建一个Security配置类,formLogin表单登录的配置,如下图:

  • 启动项目,如下图

  • 浏览器执行查询请求,如下图:

  • 由下图可知,因为不是表单登录,直接执行FilterSecurityInterceptor过滤器,然后执行 ExceptionTranslationFilter过滤器处理FilterSecurityInterceptor过滤器抛出的异常。

  • 然后跳转到SpringSecurity表单登录页面,如下图:

  • 由下图可知,在SpringSecurity表单登录页面输入用户名和密码,点击登录,先执行UsernamePasswordAuthenticationFilter过滤器,然后执行FilterSecurityInterceptor过滤器,

  • 最后输入rest服务输出的结果,如下图:

以上是关于SpringSecurity启动源码WebSecurityConfigurerAdapter分析的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot SpringSecurity 介绍(基于内存的验证)

第三篇开始和SpringSecurity的简单交往-处理请求的本质

第三篇开始和SpringSecurity的简单交往-处理请求的本质

SpringSecurity 默认表单登录页展示流程源码

springsecurity 源码解读 之 RememberMeAuthenticationFilter

源码解析SpringSecurity-UsernamePasswordAuthenticationFilter