「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
- performBuild首先就是验证authenticationProviders是否存在。上面已经说过了authenticationProviders是在
AbstractDaoAuthenticationConfigurer#configure完成加载的。默认是DaoAuthenticationProvider - 在performBuild中在借助provider完成providerManager的初始化和自动配置。
- 最终AuthenticationMangersBuilder的build也是返回这个providerManager用来作为认证管理器的。
回到WebSecurity的init
-
终于我们完成了
AuthenticationManager的创建了。这时候我们回到WebSecurity#init的过程。 -
剩下的就是一路构建http对象。最终会走到configure(HttpSecurity http)方法。这个方法也就是我们
SecurityConfig配置中的配置 -
至此!我们
WebSecurity#init就接近尾声了,最后就是将我们辛辛苦苦的http添加到WebSecurity中并添加拦截器。
CONFIGURING
- 在
WebSecurity#init我们完成的http对象的创建。一句话总结就是循环一遍原有的生命周期。这里和AuthenticationMangersBuilder#configure的步骤一样。都是执行AbstractConfiguredSecurityBuilder#configure方法。这个方法就是在执行WebSecurityConfigurerAdapter中的对应方法。我们这里是SecurityConfig中的方法。由于我们内部没有复写configure(WebSecurity)方法所以这里也没有啥用处。
BUILDING
-
既然我们
SecurityConfig中没有配置configure(WebSecurity)那么在websecurity的configure过程中就没有逻辑可言,我们开开心心的到了BUILDING状态。读者也可以自己扩展下这个方法。 -
为什么security这个的优秀,因为内部设计的是真复杂。这不眼看快胜利了,到了这里又出现另外一个
SecurityBuilder了。 -
上面我们介绍
AuthenticationManagerBuilder的时候就说了同级的还有一个HttpSecurity。 -
还记得我们在
WebSecurity创建过程中提到的HttpSecurity吗,加载玩之后我们是将HttpSecurity设置给WebSecurity的securityFilterChainBuilder属性了吗。 -
这不在
WebSecurity#performBuild过程中就用到了这个securityFilterChainBuilder属性了。 -
我们看看performBuild这个方法最终是生成一个
FilterChainProxy过滤器最终返回出去。这里securityFilterChainBuilder是HttpSecurity类。又遇到了我们build .看来是无法避免了,我们还得在看一次HttpSecurity的build的过程。 -
还是回到
WebSecurity#init中的getHttp中触发,在我们构建好HttpSecurity的时候会有加载我们HttpSecurity的配置 -
在这里的方法会通过Configure的apply方法加载configres 。 比如formLogin
BUILT
- 到了这里
WebSecurity才算是真正完成了build操作。最终也是返回FilterChainProxy. 他的内部加载了security根据我们配置初始化的过滤器链。 - 到这里我们就完成了创建名叫springSecurityFilterChain的过滤器。结合
DelegatingFilterProxy就实现了想servlet的过滤器注册