SpringSecurity源码学习(三)

前言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值