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被覆盖。

