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

1.Filters概述

在这里插入图片描述
图1 过滤链
当客户端发送一个请求到应用时,容器会创建一个过滤链FilterChain,该过滤链包含了FiltersServlet,其中Servlet会处理HttpServletRequest请求。在Spring MVC应用中,Servlet就是DispatcherServlet的一个实例。在大部分的情况下Servlet只能处理一个简单的HttpServletRequestHttpServletResponse。但是可以有多个过滤器来处理请求,过滤器的作用包括一下两个:

  1. 防止下游过滤器和请求被调用;
  2. 在下游过滤器和请求处理之前修改HttpServletRequestHttpServletResponse

举个例子:

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注册有很多优势:

  1. spring securityServlet提供了一个起点;比如你想对Servlet做故障排查,可以在FilterChainProxy打断点。
  2. 其次,由于FilterChainProxySpring Security使用的中心,它可以执行那些额外的任务。例如,它清除SecurityContext以避免内存泄漏。它还应用了Spring SecurityHttpFirewall来保护应用程序免受某些类型的攻击;
  3. FilterChainProxy在确定何时应该调用SecurityFilterChain方面提供了更大的灵活性。在Servlet容器中,仅根据URL调用过滤器。然而,FilterChainProxy可以通过利用RequestMatcher接口来决定基于HttpServletRequest中的任何调用;
  4. 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跨域资源共享
OAuth2AuthorizationRequestRedirectFilterOAuth2认证请求重定向
X509AuthenticationFilterX509证书认证
UsernamePasswordAuthenticationFilter用户名密码认证
ConcurrentSessionFilter并发会话
BearerTokenAuthenticationFilterBearer令牌认证
RememberMeAuthenticationFilter记住我认证
AnonymousAuthenticationFilter匿名认证
ExceptionTranslationFilter异常转移
SwitchUserFilter切换用户
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐