SpringSecurity源码学习(三)

    xiaoxiao2021-03-25  104

    前言

    本章讨论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.

    转载请注明原文地址: https://ju.6miu.com/read-13868.html

    最新回复(0)