前言
本章讨论SpringSecurity中的构建器的配置器。
构建器的配置器
SecurityConfigurer< O, B extends SecurityBuilder< O>>
构建器的配置器的顶级接口,下面我们说到构建器的配置器指的都是它或它的子类。
PS:
O:指的是“构建器的配置器”配置那个的“构建器”要构建的对象的类型。
B:指的是“构建器的配置器”配置那个构建对象类型是O的“构建器”的类型。
它的方法也很简单:
void init(B builder) throws Exception;
void configure(B builder) throws Exception;
它的拓展关系:
下面分别看下三个直接子类。
SecurityConfigurerAdapter< O, B extends SecurityBuilder< O>>
构建器的适配器的顶级接口的适配器(抽象实现)(适配器模式)。
ps:
O:指的是“构建器的配置器”配置那个的“构建器”要构建的对象的类型。
B:指的是“构建器的配置器”配置那个构建对象类型是O的“构建器”的类型。
这个类有一个属性非常非常非常重要:
//没错,是它,是它,就是它
private B securityBuilder;
即:构建器的配置器中维护了一个构建器对象。
这个类有一个方法比较常用:
public B and() {
return getBuilder();
}
AbstractHttpConfigurer
先看结构:
再看其类的声明:
class AbstractHttpConfigurer<T extends AbstractHttpConfigurer<T, B>, B extends HttpSecurityBuilder<B>>
extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, B>
从类的声明上来看:
1).配置器对应的构建器最终的产物是DefaultSecurityFilterChain。
2).构建这个产物的构建器是B,它是HttpSecurityBuilder< B>或它的子类。
3).T是这个配置器。
许多处理单个逻辑的过滤器的配置器都继承自它:
比如:使用LogoutConfigurer,即:给构建DefaultSecurityFilterChain的构建器添加了此配置器,那么构建出来的DefaultSecurityFilterChain就有了logout的功能。
比如:使用CsrfConfigurer,即:给构建DefaultSecurityFilterChain的构建器添加了此配置器,那么构建出来的DefaultSecurityFilterChain就有了csrf的功能。
WebSecurityConfigurer< T extends SecurityBuilder < Filter>>
这个接口什么方法也没有。那它是不是标记接口呢?不是!它其实已经窄化了范围。
PS:
T:构建器类型。构建的对象类型为Filter的构建器类型。也就是说,实现是此接口的所有的类的最终目的是为“构建的对象类型为Filter的构建器”服务。
WebSecurityConfigurerAdapter
WebSecurityConfigurerAdapter是WebSecurityConfigurer的适配。功能是:配置WebSecurity。
下面是这个配置器的init()方法,为构建的WebSecurity创建了HttpSecurity。不要忘了它俩的关系:前者用于创建“过滤器链代理”,后者用于创建“过滤器链”。
public void init(final WebSecurity web) throws Exception {
final HttpSecurity http = getHttp();
web.addSecurityFilterChainBuilder(http).postBuildAction(new Runnable() {
public void run() {
FilterSecurityInterceptor securityInterceptor = http
.getSharedObject(FilterSecurityInterceptor.class);
web.securityInterceptor(securityInterceptor);
}
});
}
它的configure()方法空实现,供子类重写,一个重写的例子:
@EnableWebSecurity
@ComponentScan("fn.wd.security")
public class SpringSecurityConfiger extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/static/**");
web.ignoring().antMatchers("/favicon.ico");
web.ignoring().antMatchers("/resources/**");
}
}
其实这三句话创建了3条链,并且这3条链中的过滤器都为空。这样其实就达到了过滤静态资源的功能。
GlobalAuthenticationConfigurerAdapter
其实有必要将这个类的全部声明说下:
class GlobalAuthenticationConfigurerAdapter implements
SecurityConfigurer<AuthenticationManager, AuthenticationManagerBuilder>
即:这个类的子类为构建器AuthenticationManagerBuilder服务,最终的产品是AuthenticationManager.