本章讨论SpringSecurity中的构建器的配置器。
构建器的配置器的顶级接口,下面我们说到构建器的配置器指的都是它或它的子类。 PS: O:指的是“构建器的配置器”配置那个的“构建器”要构建的对象的类型。 B:指的是“构建器的配置器”配置那个构建对象类型是O的“构建器”的类型。
它的方法也很简单:
void init(B builder) throws Exception; void configure(B builder) throws Exception;它的拓展关系:
下面分别看下三个直接子类。
构建器的适配器的顶级接口的适配器(抽象实现)(适配器模式)。 ps: O:指的是“构建器的配置器”配置那个的“构建器”要构建的对象的类型。 B:指的是“构建器的配置器”配置那个构建对象类型是O的“构建器”的类型。
这个类有一个属性非常非常非常重要:
//没错,是它,是它,就是它 private B securityBuilder;即:构建器的配置器中维护了一个构建器对象。
这个类有一个方法比较常用:
public B and() { return getBuilder(); }先看结构:
再看其类的声明:
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的功能。
这个接口什么方法也没有。那它是不是标记接口呢?不是!它其实已经窄化了范围。 PS: T:构建器类型。构建的对象类型为Filter的构建器类型。也就是说,实现是此接口的所有的类的最终目的是为“构建的对象类型为Filter的构建器”服务。
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条链中的过滤器都为空。这样其实就达到了过滤静态资源的功能。
其实有必要将这个类的全部声明说下:
class GlobalAuthenticationConfigurerAdapter implements SecurityConfigurer<AuthenticationManager, AuthenticationManagerBuilder>即:这个类的子类为构建器AuthenticationManagerBuilder服务,最终的产品是AuthenticationManager.