Spring Security 源码详解

Spring Security 源码详解

这里主要介绍 SpringSecurity 的整体流程,方便以后查阅!!!

一、Spring Security过滤器链加载

1、注册 springSecurityFilterChain 过滤器

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

Spring Security 源码详解_第1张图片

2、查看DelegatingFilterProxyRegistrationBean

DelegatingFilterProxyRegistrationBean 注册成功后,该过滤器就被加载了到了注册器中。
注册器注册了所有的过滤器后,会为每个过滤器生成 DelegatingFilterProxy代理对象并注册到 IoC中 。

Spring Security 源码详解_第2张图片

3、查看 DelegatingFilterProxy类

1.我们访问项目,就会进入 DelegatingFilterProxy类的 doFilter方法。
2.DelegatingFilterProxy 类本质也是一个 Filter,其间接实现了 Filter接口,但是在 doFilter中其实调用的从 Spring 容器中获取到的代理 Filter的实现类。
3.返回的 FilterChainProxy 对象。由此可知,DelegatingFilterProxy 类通过 springSecurityFilterChain 这个名称,得到了一个 FilterChainProxy过滤器,最终执行的是这个过滤器的 doFilter方法。

首先,进入DelegatingFilterProxy类的 doFilter方法
Spring Security 源码详解_第3张图片
其次,调用 DelegatingFilterProxy类的 invokeDelegate 方法
Spring Security 源码详解_第4张图片
然后,调用 FilterChainProxy 类的 doFilter 方法
Spring Security 源码详解_第5张图片

4、查看 FilterChainProxy类

FilterChainProxy 类本质也是一个 Filter,所以查看 doFilter方法。留意该类里面的属性。
// 过滤器链 private List filterChains;

点击进入doFilter()方法,在进入到 doFilterInternal(request, response, chain) 方法,所有的过滤器:List filters = getFilters(fwRequest)

Spring Security 源码详解_第6张图片

查看 getFilters方法,原来这些过滤器都被封装进 SecurityFilterChain对象中。

Spring Security 源码详解_第7张图片

5、查看 SecurityFilterChain接口

SecurityFilterChain 类是个接口,实现类也只有一个 DefaultSecurityFilterChain 类。
DefaultSecurityFilterChain 类的构造方法,初始化了 List filters,是通过传参放进去的。

Spring Security 源码详解_第8张图片

6、查看 SpringBootWebSecurityConfiguration类

过滤器链参数是什么时候传入的?
创建 Spring Security 过滤器链是交给 Spring boot 自动配置,由 SpringBootWebSecurityConfiguration 类创建注入。

Spring Security 源码详解_第9张图片

7、查看 WebSecurityConfigurerAdapter类。

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

初始化方法 init
Spring Security 源码详解_第10张图片

getHttp 方法
Spring Security 源码详解_第11张图片

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

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

Spring Security 源码详解_第12张图片

8、总结

1、Spring boot 通过 DelegatingFilterProxyRegistrationBean 注册过滤器,名为 springSecurityFilterChain,并生成 DelegatingFilterProxy代理对象并注册到 IOC中。
2、最终真正调用 FilterChainProxy 过滤器的 doFilter 获取到 Spring Security 过滤器链。
3、Spring Security 的过滤器链在底层是封装在 SecurityFilterChain 接口中的。

关注林哥,持续更新哦!!!★,°:.☆( ̄▽ ̄)/$:.°★ 。

你可能感兴趣的:(spring,java,后端,springsecurity)