SpringBoot整合Spring Security过滤器链加载执行流程源码分析

时间:2022-09-17 01:01:19


SpringBoot整合Spring Security过滤器链加载执行流程源码分析

文章目录

  • ​​1.引言​​
  • ​​2.Spring Security过滤器链加载​​
  • ​​1.2.注册名为 springSecurityFilterChain的过滤器​​
  • ​​2、查看 DelegatingFilterProxy类​​
  • ​​3.查看 FilterChainProxy类​​
  • ​​3.1 查看 doFilterInternal方法。​​
  • ​​3.2 查看 getFilters方法。​​
  • ​​4 查看 SecurityFilterChain接口​​
  • ​​5 查看 SpringBootWebSecurityConfiguration类​​

1.引言

在 Spring Boot项目之中,我们引入 Spring Security依赖,什么也没做,启动项目 Spring Security 就会生效,访问请求就进行了拦截。

Spring Boot 对于 Spring Security 提供了自动化配置方案,可以使用更少的配置来使用 Spring Security。

那么这个过滤器链是怎么加载和实现拦截的呢?

2.Spring Security过滤器链加载

1.2.注册名为 springSecurityFilterChain的过滤器

当 Spring Boot 项目启动后,​​SecurityFilterAutoConfiguration​​​类会加载 ​​DelegatingFilterProxyRegistrationBean​​​注册过滤器,名字为 ​​springSecurityFilterChain​​。

SpringBoot整合Spring Security过滤器链加载执行流程源码分析

注意:springSecurityFilterChain名字是固定写死的。

​DelegatingFilterProxyRegistrationBean​​​ 注册成功后,该过滤器就被加载了到了注册器中。然后调用getFilter()方法生成 ​​DelegatingFilterProxy​​​代理对象并注册到 ​​IOC​​中 。

SpringBoot整合Spring Security过滤器链加载执行流程源码分析

2、查看 DelegatingFilterProxy类

我们访问项目,就会进入 ​​DelegatingFilterProxy​​​类的 ​​doFilter​​方法。

DelegatingFilterProxy类本质也是一个 Filter,其间接实现了 Filter接口,但是在 doFilter中其实调用的从 Spring 容器中获取到的代理 Filter的实现类。

SpringBoot整合Spring Security过滤器链加载执行流程源码分析


返回的 ​​FilterChainProxy​​对象。

由此可知,​​DelegatingFilterProxy​​​类通过 ​​springSecurityFilterChain​​​这个名称,得到了一个 ​​FilterChainProxy​​​过滤器,最终执行的是这个过滤器的 ​​doFilter​​方法。

验证 springSecurityFilterChain名词不能修改
查看 initDelegate方法。

SpringBoot整合Spring Security过滤器链加载执行流程源码分析

3.查看 FilterChainProxy类

​FilterChainProxy​​​类本质也是一个 Filter,所以查看 ​​doFilter​​方法。留意该类里面的属性。

public class FilterChainProxy extends GenericFilterBean {
private static final Log logger = LogFactory.getLog(FilterChainProxy.class);
private static final String FILTER_APPLIED =
FilterChainProxy.class.getName().concat(".APPLIED");
// 过滤器链
private List<SecurityFilterChain> filterChains;
private FilterChainProxy.FilterChainValidator filterChainValidator;
private HttpFirewall firewall;

3.1 查看 doFilterInternal方法。

惊不惊喜?15个过滤器都在这里了!

SpringBoot整合Spring Security过滤器链加载执行流程源码分析

3.2 查看 getFilters方法。

原来这些过滤器都被封装进 SecurityFilterChain对象中。

SpringBoot整合Spring Security过滤器链加载执行流程源码分析

4 查看 SecurityFilterChain接口

​SecurityFilterChain​​​类是个接口,实现类也只有一个 ​​DefaultSecurityFilterChain​​类。

​DefaultSecurityFilterChain​​类的构造方法,初始化了 List filters,是通过传参放进去的。

SpringBoot整合Spring Security过滤器链加载执行流程源码分析


过滤器链参数是什么时候传入的?

5 查看 SpringBootWebSecurityConfiguration类

创建 ​​Spring Security​​​ 过滤器链是交给 ​​Spring boot​​​ 自动配置,由 ​​SpringBootWebSecurityConfiguration​​类创建注入。

SpringBoot整合Spring Security过滤器链加载执行流程源码分析


查看 ​​WebSecurityConfigurerAdapter​​类。

SpringBoot整合Spring Security过滤器链加载执行流程源码分析


然后会注入 HttpSecurity对象,HttpSecurity可以理解为 Spring Security 的 http核心配置,存放 Spring Security 中的过滤器链、请求匹配路径等相关认证授权的重要方法。

然后开始创建 Spring Security 过滤器链了,是交给 Spring Boot自动配置,一共有 15个过滤器。
使用 OrderedFilter进行代理,并设置了order属性。
添加完成后,将这些过滤器再封装为 DefaultSecurityFilterChain对象。

最后通过 WebSecurityConfiguration配置加载 springSecurityFilterChain,WebSecurityConfiguration中维护了securityFilterChains属性,会存放过滤器链中所有的过滤器。

总结
Spring boot 通过 ​​​DelegatingFilterProxyRegistrationBean​​​注册过滤器,名字为 ​​springSecurityFilterChain​​​,并生成 ​​DelegatingFilterProxy​​​代理对象并注册到 IoC中。最终真正调用 ​​FilterChainProxy​​​过滤器的 ​​doFilter​​​ 获取到 ​​Spring Security 过滤器链​​。

Spring Security的过滤器链在底层是封装在 SecurityFilterChain接口中的。