上篇回顾
前面我们已经分析了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的运行过程》