在上一篇文章中我们最后给出了一张图
我们看到我们没有配置任何东西的时候,spring security
为我们加载了11个过滤器
这些过滤器哪里来的?
这篇文章先回答这个问题,然后在说说我们默认的过滤器的作用,重要的过滤器我们后面再通过几篇文章重点说。因为我们知道这些过滤器,我们还要知道怎么通过配置我们让过滤器按照我们的思路去完成逻辑
1.默认过滤器的来源
默认过滤器是怎么配置进来的呢?我们前面有说到过,在spring security的加载过程中会调用到WebSecurityConfigurerAdapter
的getHttp()
方法,我们在这里还是把这个方法的源代码贴出来
return http;
}
DefaultAuthenticationEventPublisher eventPublisher = objectPostProcessor
.postProcess(new DefaultAuthenticationEventPublisher());
localConfigureAuthenticationBldr.authenticationEventPublisher(eventPublisher);
AuthenticationManager authenticationManager = authenticationManager();
authenticationBuilder.parentAuthenticationManager(authenticationManager);
Map<Class<? extends Object>, Object> sharedObjects = createSharedObjects();
http = new HttpSecurity(objectPostProcessor, authenticationBuilder,
sharedObjects);
if (!disableDefaults) {
// @formatter:off
http
.csrf().and()
.addFilter(new WebAsyncManagerIntegrationFilter())
.exceptionHandling().and()
.headers().and()
.sessionManagement().and()
.securityContext().and()
.requestCache().and()
.anonymous().and()
.servletApi().and()
.apply(new DefaultLoginPageConfigurer<>()).and()
.logout();
// @formatter:on
ClassLoader classLoader = this.context.getClassLoader();
List<AbstractHttpConfigurer> defaultHttpConfigurers =
SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, classLoader);
for(AbstractHttpConfigurer configurer : defaultHttpConfigurers) {
http.apply(configurer);
}
}
//??configure??
configure(http);
return http;
}
- 这个方法在前面有写过注释,这里不再赘述,我们看到下面的这段代码
if (!disableDefaults) {
// @formatter:off
http
.csrf().and()
.addFilter(new WebAsyncManagerIntegrationFilter())
.exceptionHandling().and()
.headers().and()
.sessionManagement().and()
.securityContext().and()
.requestCache().and()
.anonymous().and()
.servletApi().and()
.apply(new DefaultLoginPageConfigurer<>()).and()
.logout();
// @formatter:on
ClassLoader classLoader = this.context.getClassLoader();
List<AbstractHttpConfigurer> defaultHttpConfigurers =
SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, classLoader);
for(AbstractHttpConfigurer configurer : defaultHttpConfigurers) {
http.apply(configurer);
}
}
如果没有禁止掉默认配置的话HttpSecurity会进行一下默认配置
http
.csrf().and()
.addFilter(new WebAsyncManagerIntegrationFilter())
.exceptionHandling().and()
.headers().and()
.sessionManagement().and()
.securityContext().and()
.requestCache().and()
.anonymous().and()
.servletApi().and()
.apply(new DefaultLoginPageConfigurer<>()).and()
.logout();
我们把这个叫做代码块1
我们下面具体讲过滤器,然后再说是哪一句代码才有的过滤器
2.过滤器列表概述
按照执行顺序
2.1 第一个过滤器 WebAsyncManagerIntegrationFilter
-
默认加载配置,请看下图
- 过滤器作用
从类的注释上我们就可以知道,先看一下注释
/**
* Provides integration between the {@link SecurityContext} and Spring Web's
* {@link WebAsyncManager} by using the
* {@link SecurityContextCallableProcessingInterceptor#beforeConcurrentHandling(org.springframework.web.context.request.NativeWebRequest, Callable)}
* to populate the {@link SecurityContext} on the {@link Callable}.
*
* @author Rob Winch
* @see SecurityContextCallableProcessingInterceptor
*/
public final class WebAsyncManagerIntegrationFilter extends OncePerRequestFilter {
简单来说就是提供SecurityContext和spring Web的集成
2.2 第二个过滤器 SecurityContextPersistenceFilter
-
通过下面的配置加载进来
- 作用:其实主要是为了加载
SecurityContext
对象,然后加载到SecurityContextHolder
2.3 第三个过滤器HeaderWriterFilter
- 默认加载配置
- 作用:主要是对响应信息的请求头添加一些配置
2.4 第四个过滤器CsrfFilter
- 默认加载配置
- 作用:主要防止跨站请求伪造
2.5 第五个过滤器LogoutFilter
- 默认加载配置
- 作用:主要是对登出操作的处理
2.6 第六个过滤器UsernamePasswordAuthenticationFilter
-
默认加载配置
- 作用:主要是用户名密码登录认证
2.7 第七个过滤器RequestCacheAwareFilter
-
默认加载配置
作用:用于用户登录成功后,重新恢复因为登录被打断的请求
2.8 第八个过滤器SecurityContextHolderAwareRequestFilter
- 作用:填充ServletRequest
实现servlet API安全方法的包装器
2.9 第九个过滤器AnonymousAuthenticationFilter
-
默认加载配置
- 作用:匿名用户信息的填充
2.10 第十个过滤器SessionManagementFilter
-
默认加载配置
- 作用:会话的管理机制
2.11 第十一个过滤器ExceptionTranslationFilter
-
默认加载配置
- 作用:对于任意的AccessDeniedException类型的异常和AuthenticationException类型异常的处理
3.总结
我们暂时还不具备详细的阅读源码来看这些Filter具体实现的过程。因为我们还要做一些准备工作,当阅读完其他的一些源代码再仔细的回头看每一个Filter,这里只是暂时先做一个预热而已。