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 初始化就完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值