上篇回顾
前面我们已经分析了Spring Security的核心过滤器FilterChainProxy的创建和运行过程,认识了建造者和配置器的作用。
现在我们知道WebSecurity作为一个建造者就是用来创建核心过滤器FilterChainProxy实例的。
WebSecurity在初始化的时候会扫描WebSecurityConfigurerAdapter配置器适配器的子类(即生成HttpSecurity配置器)。
所有的配置器会被调用init();configure();初始化配置,其中生成的每个HttpSecurity配置器都代表了一个过滤器链。
本篇要说的就是HttpSecurity作为一个建造者,是如何去建造出SecurityFilterChain过滤器链实例的!
PS:如果有多个
WebSecurityConfigurerAdapter配置器适配器的子类,会产生多个SecurityFilterChain过滤器链实例。Spring Security Oauth2的拓展就是这么做的,有机会再介绍
spring security 怎么创建的过滤器
我们已经知道了
springSecurityFilterChain(类型为FilterChainProxy)是实际起作用的过滤器链,DelegatingFilterProxy起到代理作用。
我们创建的
MySecurityConfig继承了WebSecurityConfigurerAdapter。WebSecurityConfigurerAdapter就是用来创建过滤器链,重写的configure(HttpSecurity http)的方法就是用来配置HttpSecurity的。
protected void configure(HttpSecurity http) throws Exception {
http
.requestMatchers() // 指定当前`SecurityFilterChain`实例匹配哪些请求
.anyRequest().and()
.authorizeRequests() // 拦截请求,创建FilterSecurityInterceptor
.anyRequest().authenticated() // 在创建过滤器的基础上的一些自定义配置
.and() // 用and来表示配置过滤器结束,以便进行下一个过滤器的创建和配置
.formLogin().and() // 设置表单登录,创建UsernamePasswordAuthenticationFilter
.httpBasic(); // basic验证,创建BasicAuthenticationFilter
}
上面的
configure(HttpSecurity http)方法内的配置最终内容主要是Filter的创建。
http.authorizeRequests()、http.formLogin()、http.httpBasic()分别创建了ExpressionUrlAuthorizationConfigurer,FormLoginConfigurer,HttpBasicConfigurer。在三个类从父级一直往上找,会发现它们都是SecurityConfigurer建造器的子类。SecurityConfigurer中又有configure()方法。该方法被子类实现就用于创建各个过滤器,并将过滤器添加进HttpSecurity中维护的装有Filter的List中,比如HttpBasicConfigurer中的configure方法,源码如下:
HttpSecurity作为建造者会把根据api把这些配置器添加到实例中
这些
配置器中大都是创建了相应的过滤器,并进行配置,最终在HttpSecurity建造SecurityFilterChain实例时放入过滤器链
系列文章:《深入浅出Spring Security(一):三句话解释框架原理》
系列文章:《深入浅出Spring Security(二):FilterChainProxy的创建过程》
系列文章:《深入浅出Spring Security(三):FilterChainProxy的运行过程》