Spring Security过滤链FilterChain
众所周知,spring security是一个集认证,授权和泄露保护于一体的安全框架,让我们来探讨一下它的过滤链机制!
1.Filters概述

图1 过滤链
当客户端发送一个请求到应用时,容器会创建一个过滤链FilterChain,该过滤链包含了Filters和Servlet,其中Servlet会处理HttpServletRequest请求。在Spring MVC应用中,Servlet就是DispatcherServlet的一个实例。在大部分的情况下Servlet只能处理一个简单的HttpServletRequest和HttpServletResponse。但是可以有多个过滤器来处理请求,过滤器的作用包括一下两个:
- 防止下游过滤器和请求被调用;
- 在下游过滤器和请求处理之前修改
HttpServletRequest和HttpServletResponse;
举个例子:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// 在rest应用之前干些事情
chain.doFilter(request, response); // 调用rest应用
//在rest应用之后干些事情
}
2.DelegatingFilterProxy
spring security提供DelegatingFilterProxy使Servlet容器生命周期和Spring应用上下文之间产生联系。DelegatingFilterProxy通过标准Servlet容器机制被注册进应用,并且代理了所有实现Filter类的Spring Bean。

图2 DelegatingFilterProxy
以下是DelegatingFilterProxy的伪代码
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// 通过懒加载的方式获得Filter Bean
// DelegatingFilterProxy代理是一个Filter Bean的实例
Filter delegate = getFilterBean(someBeanName);
// 代理所有Spring Bean的工作
delegate.doFilter(request, response);
}
3.FilterChainProxy
spring security提供FilterChainProxy来代理SecurityFilterChain管理的大量Filter实例。FilterChainProxy是通过DelegatingFilterProxy包装过的Bean。

图3 FilterChainProxy
4.SecurityFilterChain

图4 多重SecurityFilterChain
Security Filter是通过FilterChainProxy而不是DelegatingFilterProxy注册进SecurityFilterChain的。通过FilterChainProxy注册有很多优势:
- 为
spring security的Servlet提供了一个起点;比如你想对Servlet做故障排查,可以在FilterChainProxy打断点。 - 其次,由于
FilterChainProxy是Spring Security使用的中心,它可以执行那些额外的任务。例如,它清除SecurityContext以避免内存泄漏。它还应用了Spring Security的HttpFirewall来保护应用程序免受某些类型的攻击; FilterChainProxy在确定何时应该调用SecurityFilterChain方面提供了更大的灵活性。在Servlet容器中,仅根据URL调用过滤器。然而,FilterChainProxy可以通过利用RequestMatcher接口来决定基于HttpServletRequest中的任何调用;FilterChainProxy可以用来决定使用哪个SecurityFilterChain,这样可以为应用程序的不同部分提供完全独立的配置。
在多重SecurityFilterChain图中FilterChainProxy决定应该使用哪个SecurityFilterChain。只有第一个匹配的SecurityFilterChain将被调用。如果接收到的URL请求为/api/messages/,它将首先匹配SecurityFilterChain 0的模式/api/**,所以只有SecurityFilterChain 0将被调用,即使它也匹配SecurityFilterChain n。如果URL为/messages/,它将不匹配SecurityFilterChain 0的模式/api/**,所以FilterChainProxy将继续尝试每个SecurityFilterChain。假设没有其他匹配的实例,SecurityFilterChain n会被调用。
注意,SecurityFilterChain 0只配置了三个安全过滤器实例。然而,SecurityFilterChain n配置了四个安全过滤器。重要的是要注意,每个SecurityFilterChain都可以是唯一的,并且可以单独配置。事实上,如果应用程序希望Spring security忽略某些请求,SecurityFilterChain可能没有安全过滤器。
5.常见Security Filters(按顺序)
| Filter | 用途 |
|---|---|
| ChannelProcessingFilter | 用于通道处理的 |
| WebAsyncManagerIntegrationFilter | 异步集成 |
| CorsFilter | 跨域资源共享 |
| CsrfFilter | 处理跨域站点伪造 |
| LogoutFilter | 注销 |
| CorsFilter | 跨域资源共享 |
| OAuth2AuthorizationRequestRedirectFilter | OAuth2认证请求重定向 |
| X509AuthenticationFilter | X509证书认证 |
| UsernamePasswordAuthenticationFilter | 用户名密码认证 |
| ConcurrentSessionFilter | 并发会话 |
| BearerTokenAuthenticationFilter | Bearer令牌认证 |
| RememberMeAuthenticationFilter | 记住我认证 |
| AnonymousAuthenticationFilter | 匿名认证 |
| ExceptionTranslationFilter | 异常转移 |
| SwitchUserFilter | 切换用户 |
本文深入探讨了SpringSecurity中的过滤链机制,包括FilterChain、DelegatingFilterProxy、FilterChainProxy和SecurityFilterChain等核心组件的功能及工作原理,并列举了常见的安全过滤器。
893

被折叠的 条评论
为什么被折叠?



