Spring Security的WebSecurityConfiguration配置及初始化流程
基于源码的流程分析
下面的源码基于Spring Security 4.0.3
版本。
入口 WebSecurityConfiguration
WebSecurityConfiguration
的目的是配置WebSecurity
来创建[FilterChainProxy][FilterChainProxy]
|
|
这里会对WebSecurity套用所有的SecurityConfigurer
的实例,包括自定义的继承了WebSecurityConfigurerAdapter
的自定义配置。
这里的套用的过程只是把实例添加到configurers
属性中
|
|
最终在build的过程中会初始化这些配置并套用。
配置HttpSecurity
WebSecurityConfigurerAdapter会初始化一个默认的HttpSecurity,同时会调用protected void configure(HttpSecurity http)
来进行自定义的设置。最终HttpSecurity的实例会作为SecurityFilterChainBuilder传入WebSecurity,以及调用postBuildAction
来设置FilterSecurityInterceptor。
|
|
WebSecurity
中的FilterSecurityInterceptor
最终还会用来构建WebInvocationPrivilegeEvaluator
用于页面标签的权限控制。从目前源码上来看,页面标签的WebInvocationPrivilegeEvaluator
只会使用最后设置到WebSecurity
中的FilterSecurityInterceptor
。如果有多个WebSecurityConfigurerAdapter的子类实例,那么只有最后一个HttpSecurity中的FilterSecurityInterceptor才会生效,其余的会被覆盖。所以,页面标签的权限控制要注意HttpSecurity
配置的顺序,WebSecurityConfigurerAdapter
默认优先度是100
|
|
构建Filter
WebSecurity最终会构建Servlet Filter。HttpSecurity的performBuild则最终会构建DefaultSecurityFilterChain对象,然后添加到Filter的securityFilterChains中
|
|
|
|
相关的一些问题
Spring Boot的H2ConsoleAutoConfiguration导致页面标签的权限控制不正常
如果Spring Boot启用了H2 Console的话,由于H2ConsoleAutoConfiguration并没有注解@ConditionalOnMissingBean(WebSecurityConfiguration.class)
,所以即便应用配置了WebSecurityConfiguration的子类,如果没有显示地把security.basic.enabled
设置成false的话,最终还是会导致H2ConsoleSecurityConfiguration
配置的套用,H2ConsoleSecurityConfiguration
的优先度是SecurityProperties.BASIC_AUTH_ORDER - 10
,比较低,反而容易导致WebSecurity
的FilterSecurityInterceptor
被覆盖。