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

 

posted @ 2022-03-27 17:17  colin220  阅读(1251)  评论(0编辑  收藏  举报