SpringSecurity启动源码WebSecurityConfigurerAdapter分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringSecurity启动源码WebSecurityConfigurerAdapter分析相关的知识,希望对你有一定的参考价值。
参考技术ASpringSecurity启动源码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的简单交往-处理请求的本质