Spring Security:(八)WebSecurity与HttpSecurity初始化

调用 WebSecurity 的 build() 方法返回一个 FilterChainProxy 实例。

调用 HttpSecurity 的 build() 方法返回一个 SecurityFilterChain 实例(DefaultSecurityFilterChain 是 SecurityFilterChain 的唯一实现类)。

WebSecurity 和 HttpSecurity 是如何初始化的?

需要重新从 FilterChainProxy 初始化过程开始看,参考前面文章 启动时初始化FilterChainProxy

WebSecurity 初始化

在执行 WebSecurityConfiguration 的 setFilterChainProxySecurityConfigurer(...) 方法时,通过 new 关键字实例化了 WebSecurity。

至此 WebSecurity 就初始化完成了。

HttpSecurity 初始化

步骤一

从 WebSecurityConfiguration 的 setFilterChainProxySecurityConfigurer(...) 方法开始执行。

这次重点看上图的三处位置:

1. 上图标①位置是一个 @Value 注解,里面是 Spring SpEL 表达式,其作用是调用 AutowiredWebSecurityConfigurersIgnoreParents 的 getWebSecurityConfigurers() 方法,并将返回赋值给上图中标②位置的 webSecurityConfigurers

2. 上图标②位置的 webSecurityConfigurers 已经被赋值了。查看 AutowiredWebSecurityConfigurersIgnoreParents 的 getWebSecurityConfigurers() 方法体,其返回值是所有 WebSecurityConfigurer 实例的 List 集合。

3. 上图标③位置,是调用 WebSecurity 的 apply(...) 方法,其作用是将 webSecurityConfigurers 中的元素添加到 WebSecurity 的属性 configurers 中(见下图 AbstractConfiguredSecurityBuilder 是 WebSecurity 父类)。

到此总结一下:在 WebSecurity 的 configurers 属性中保存了所有的 WebSecurityConfigurer 实例

步骤二

继续往下梳理,接着执行 WebSecurityConfiguration 的 springSecurityFilterChain() 方法:

会调用 WebSecurity 的 build() 方法,webSecurity 的 build() 方法梳理参考前面的文章 通过WebSecurity构建FilterChainProxy

在 WebSecurity 的 build() 方法执行过程中,会走到 dobuild() 方法体中,这次重点关注其中的 init() 这一步:

查看 init() 的方法体:

在 init() 方法体中先调用了 getConfigurers() 方法,获取一个集合,遍历并调用集合中元素的 init(...) 方法。查看 getConfigurers() 方法体可以看到是从 WebSecurity 的属性 configurers 中获取元素。在前面步骤一中已经知道了 configurers 就是 WebSecurityConfigurer 实例的集合。

因而下一步,就是查看 WebSecurityConfigurer 的 init(...) 方法。

到此总结一下:获取 WebSecurity 的属性 configurers,并遍历其中的 WebSecurityConfigurer 实例,调用 WebSecurityConfigurer 的 init(...) 方法。

步骤三

因 WebSecurityConfigurerAdapter 是 WebSecurityConfigurer 的实现类,因而到 WebSecurityConfigurerAdapter 中查看 init(..) 方法体:

通过调用 getHttp() 方法获取了 HttpSecurity 的实例,进入到 getHttp() 方法中查看:

通过 new 关键字实例化了 HttpSecurity。

至此  HttpSecurity 初始化就完成了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值