Spring Security:(六)过滤器链SecurityFilterChain
Spring Security 的功能点入口是 FilterChainProxy,在 FilterChainProxy 中管理着多个过滤器链 SecurityFilterChain。
Spring Security 中是通过调用 HttpSecurity 的 build() 方法实例化 SecurityFilterChain。
过滤器链 SecurityFilterChain 是多个过滤器的集合。(注意区分 Servlet 容器中的 Filter 过滤器 和 Spring Security 的 Security Filter 过滤器,参考前面的文章 DelegatingFilterProxy与FilterChainProxy关系 )
FilterChainProxy 与 SecurityFilterChain 关系
二者关系参考下图(摘自 Spring Security 官网的图):
在 FilterChainProxy 里面有个属性为 filterChains,这是一个 List 集合,其中的元素就是 SecurityFilterChain
在 SecurityFilterChain 中定义了 getFilters() 方法,其返回值是一个 List 集合,其中的元素是 Filter
SecurityFilterChain 的唯一实现类是 DefaultSecurityFilterChain
SecurityFilterChain 初始化
FilterChainProxy 的初始化过程在前面的文章 启动时初始化FilterChainProxy 已经提到了。那 SecurityFilterChain 是如何初始化的?
这需要重新查看 webSecurity.build() 方法实例化 FilterChainProxy 的逻辑,参考前面的文章 通过WebSecurity构建FilterChainProxy 。
在调用 webSecurity.build() 方法时,会走到下面两个重要的节点:
init
查看 init() 的方法体:
这里会调用 configurer.init((B) this) 方法,这里 configurer 其实是 WebSecurityConfigurerAdapter 实例,查看 WebSecurityConfigurerAdapter 的 init() 方法体:
通过上面的源码可以看到:
- 先创建了一个 HttpSecurity 的实例
- 调用 WebSecurity 的 addSecurityFilterChainBuilder 方法
接着查看 WebSecurity 的 addSecurityFilterChainBuilder 方法体:
可以看到 HttpSecurity 的实例被加到 WebSecurity 的 securityFilterChainBuilders 属性中,这里的 securityFilterChainBuilders 是一个 List 集合 。
这样 init 方法就执行完了。
performBuild
接着查看 performBuild() 方法体:
通过上面源码可以看到:
- 先创建了一个名为 securityFilterChain 的 List
- 遍历 securityFilterChainBuilders 中的元素,然后调用元素中 build() 方法,将返回值添加到 securityFilterChain 中
- 最后将 securityFilterChain 放到 FilterChainProxy 中
在上一步中 init 方法中可以知道 securityFilterChainBuilders 中的元素是 HttpSecurity,调用 HttpSecurity 的 build() 方法返回 SecurityFilterChain 实例。
至此 SecurityFilterChain 初始化就完成了。