通过上篇文章中的debug分析,目前我们已经知道了以下几个概念:
1、DelegatingFilterProxy
2、springSecurityFilterChain
3、SpringBoot是如何找到SpringSecurity的配置入口SecurityAutoConfiguration
4、SpringSecurity处理请求的基本流程
另外在自动配置类SecurityAutoConfiguration中,引入了配置类WebSecurityEnablerConfiguration
![v2-b96b8bee826e4cc373e09fcf526658ab_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-b96b8bee826e4cc373e09fcf526658ab_b.png)
![v2-fe617f319608cdb342d9e2f1241cf175_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-fe617f319608cdb342d9e2f1241cf175_b.jpg)
还是这个@EnableWebSecurity注解,上篇文章中只是简单的介绍了一下其引入的WebSecurityConfiguration配置类,并且在WebSecurityConfiguration配置类中看到了springSecurityFilterChain的bean定义,下面来看下@EnableGlobalAuthentication注解中有什么内容
![v2-d48a03cf0f1d078b3439b2d0166983b4_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-d48a03cf0f1d078b3439b2d0166983b4_b.jpg)
可以@EnableGlobalAuthentication注解的主要工作其实又是由AuthenticationConfiguration配置类来完成的
![v2-c31f0659345effe9a42e5947a9e1ec13_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-c31f0659345effe9a42e5947a9e1ec13_b.jpg)
可以看到AuthenticationConfiguration又导入了另一个配置类ObjectPostProcessorConfiguration
![v2-08719dba0145f50d54b739dd433e5d3f_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-08719dba0145f50d54b739dd433e5d3f_b.jpg)
![v2-53968ba90d95496bb98137bdbca6a933_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-53968ba90d95496bb98137bdbca6a933_b.jpg)
下面先来简单看下这两个配置类中都有哪些bean,混个眼熟。
一、ObjectPostProcessorConfiguration
post-processor在编程中很常见,可以理解为一个后置处理器。当然前置处理器就是pre-processor。这个配置类中只配置了一个bean:
![v2-b5cafc1f04d30041c06e2a304c3035f3_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-b5cafc1f04d30041c06e2a304c3035f3_b.png)
自动传入的bean是一个AutowireCapableBeanFactory类型的BeanFactory,顾名思义就是具有自动装配能力的beanFactory。
ObjectPostProcessorConfiguration中只是通过AutowireCapableBeanFactory生成了一个名为objectPostProcessor的bean,并没有其他逻辑。
![v2-8afc53182e101fbc5f918089c1f4d9ee_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-8afc53182e101fbc5f918089c1f4d9ee_b.png)
二、AuthenticationConfiguration
authenticationConfiguration配置类中存在四个bean,如下图所示
1、AuthenticationManagerBuilder
![v2-c1cc3792a0948e8e2fef58d98a6d84d9_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-c1cc3792a0948e8e2fef58d98a6d84d9_b.jpg)
2、GlobalAuthenticationConfigurerAdapter
![v2-d79db00dc06b53cc33f4b092220320a0_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-d79db00dc06b53cc33f4b092220320a0_b.png)
3、InitializeUserDetailsBeanManagerConfigurer
![v2-1c9578db25fb01189d407f2f86c619be_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-1c9578db25fb01189d407f2f86c619be_b.png)
4、InitializeAuthenticationProviderBeanManagerConfigurer
![v2-e41734705104435054b9364e0a1864ad_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-e41734705104435054b9364e0a1864ad_b.png)
列出上面的bean都是为了混个脸熟,先只需要知道这些bean的存在就行,后面会用到。通过上一篇的debug分析,我们可以知道SpringSecurity框架的入口就是springSecurityFilterChain的doFilter方法。要是想熟悉整个验证流程,则最好从这个方法开始一步步深入。不过在查看doFilter方法之前,先来看下springSecurityFilterChain的初始化细节。
三、springSecurityFilterChain的bean初始化
![v2-38f5c41644a97d9700e68fc16bea7217_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-38f5c41644a97d9700e68fc16bea7217_b.jpg)
1、webSecurityConfigurers
初始化bean的第一步用到了这个webSecurityConfigurers的类,在当前类中搜索这个变量:
![v2-b3f288ab614686e0af863ab6f03c524e_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-b3f288ab614686e0af863ab6f03c524e_b.png)
可以发现这是个SecurityConfigurer<Filter, WebSecurity>类型的List,来看下它是在哪初始化的。在当前配置类中发现了下面这个方法,@Autowired注解自动注入了两个bean,分别是objectPostProcessor和webSecurityConfigurers。objectPostProcessor在本文最开始的时候我们已经看到了,webSecurityConfigurers是在初始化的呢?
![v2-8d3c365d0f37bb5996584bd8066273d1_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-8d3c365d0f37bb5996584bd8066273d1_b.jpg)
不过我们可以发现参数之前有个@Value注解:
![v2-3ea3348991df157d8cf11fcaecc37121_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-3ea3348991df157d8cf11fcaecc37121_b.png)
这个注解的意思是,webSecurityConfigurers是通过调用beanName为autowiredWebSecurityConfigurersIgnoreParents的bean的getWebSecurityConfigurers()获得的。而这个bean恰好在当前配置类中有定义,来了解下其内部逻辑
![v2-e02a736aa08ea863f27c214c44f2a59c_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-e02a736aa08ea863f27c214c44f2a59c_b.png)
我们可以看到getWebSecurityConfigurers方法确实存在
![v2-16d14564e17822d3b36b2e6eddc1a5bb_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=b0d9bfb5-1e2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-16d14564e17822d3b36b2e6eddc1a5bb_b.jpg)
通过代码我们可以得知,webSecurityConfigurers其实就是spring上下文中所有WebSecur