源码追踪最终回到原点,一切都是这么的神奇

120 阅读2分钟

「这是我参与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的过滤器注册