[Spring Security]SecurityFilterChain 与安全过滤器的一般顺序
在 Spring Security 中,每一条SecurityFilterChain
都匹配一种路径规则,并按顺序持有一条过滤器链,接口如下:
public interface SecurityFilterChain {
// 是否匹配该请求的
boolean matches(HttpServletRequest request);
// 过滤器列表
List<Filter> getFilters();
}
VirtualFilterChain
中doFilter()
过滤方法如下:
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
// 安全过滤器调用链调用结束
if (currentPosition == size) {
// Deactivate path stripping as we exit the security filter chain
this.firewalledRequest.reset();
originalChain.doFilter(request, response);
}else {
// 按顺序调用安全过滤器调用链的安全过滤器对请求进行处理
currentPosition++;
Filter nextFilter = additionalFilters.get(currentPosition - 1);
nextFilter.doFilter(request, response, this);
}
}
}
它将按顺序逐个调用过滤器调用链中的安全过滤器对请求进行处理。
在web应用中,spring-security根据我们配置的安全规则(通常是配置WebSecurityConfigurerAdapter.HttpSecurity
)为我们的应用组装按照路径匹配的SecurityFilterChain
,其内持有根据我们配置的安全规则生成的安全过滤器列表,这些过滤器按照严格的顺序进行调用和排序,它们具备处理应用的安全逻辑。当一个请求到达应用时,FilterChainProxy
将根据请求的路径获取到匹配的SecurityFilterChain
对请求进行安全过滤处理。一旦通过了这些过滤器的处理,就可以请求到对应的资源。
接着我们介绍具体的安全过滤器中,了解一下安全过滤器调用链中的过滤器的大概顺序以及各个过滤器的大概功能,最后会对一些核心过滤器的代码进行介绍。
安全过滤器的一般顺序和功能
在安全过滤器调用链中,过滤器的顺序是非常重要,它将决定spring-security-web中认证和鉴权的流程和结果,过滤器的顺序一般如下:
-
ChannelProcessingFilter
,应对可能出现重定向到其他协议 -
SecurityContextPersistenceFilter
,请求开始的时候在SecurityContextHolder
中创建SecurityContext
,并且在请求结束的时候清理SecurityContextHolder
。在请求结束的时候可以将SecuriytContext
复制到HttpSession
中以用于下次请求 -
ConcurrentSessionFilter
,使用SecurityContextHolder
来更新SessionRegistry
中对应当前请求的principal -
UsernamePasswordAuthenticationFilte
,CasAuthenticationFilter
,BasicAuthenticationFilter
,认证处理机制,用于为SecurityContextHolder
注入一个经过认证的Authentication
-
SecurityContextHolderAwareRequestFilter
,是用来servlet容器中安装一个spring-security-awareHttpServletRequestWrapper
-
JaasApiIntegrationFilter
,如果一个JaasAuthenticationToken
在SecurityContextHolder
时,该过滤器将过滤器调用链中的JaasAuthenticationToken
的主体 -
RememberMeAuthenticationFilter
,如果前面的认证处理机制没有更新SecurityContextHolder
,并且请求中提供了cookie允许记住我服务的发生,那么一个记住我的Authentication
将被更新到SecurityContextHolder
中 -
AnonymousAuthenticationFilter
,如果前面的认证处理机制没有更新SecurityContextHolder
,这是表明用户没有登录,那么一个匿名的Authentication
将被放置到SecurityContextHolder
-
ExceptionTranslationFilter
,用来catch spring-security-exception用来组装一个HTTP error响应或者加载AuthenticationEntryPoint
进行处理 -
FilterSecurityInterceptor
,用于保护资源,是spring-security鉴权的主要过滤器,当访问被拒绝时抛出异常
在spring-security中还有很多其他的过滤器,但是在此就不不一一累述,不然没完没了。以上的Filter
继承了InitializingBean
,在调用过程中并没有安装它们的标准过滤器生命周期方法执行。官方建议使用spring应用的上下文生命周期接口作为代替,由spring管理这些过滤器的生命周期。
- 点赞
- 收藏
- 关注作者
评论(0)