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() 方法体:

通过上面的源码可以看到:

  1. 先创建了一个 HttpSecurity 的实例
  2. 调用 WebSecurity 的 addSecurityFilterChainBuilder 方法

接着查看 WebSecurity 的 addSecurityFilterChainBuilder 方法体:

可以看到 HttpSecurity 的实例被加到 WebSecurity 的 securityFilterChainBuilders 属性中,这里的 securityFilterChainBuilders 是一个 List 集合 。

这样 init 方法就执行完了。

performBuild

接着查看 performBuild() 方法体:

通过上面源码可以看到:

  1. 先创建了一个名为 securityFilterChain 的 List
  2. 遍历 securityFilterChainBuilders 中的元素,然后调用元素中 build() 方法,将返回值添加到 securityFilterChain 
  3. 最后将 securityFilterChain 放到 FilterChainProxy 中

在上一步中 init 方法中可以知道 securityFilterChainBuilders 中的元素是 HttpSecurity,调用 HttpSecurity 的 build() 方法返回 SecurityFilterChain 实例。

至此 SecurityFilterChain 初始化就完成了。

 

posted @ 2022-03-26 21:40  colin220  阅读(7110)  评论(0编辑  收藏  举报