[Spring Security]SecurityFilterChain 与安全过滤器的一般顺序

举报
chongz-z 发表于 2021/01/22 22:07:50 2021/01/22
7.2k+ 0 0
【摘要】 在 Spring Security 中,每一条SecurityFilterChain都匹配一种路径规则,并按顺序持有一条过滤器链,接口如下:public interface SecurityFilterChain { // 是否匹配该请求的 boolean matches(HttpServletRequest request); // 过滤器列表 List<Filter> getFilter...

在 Spring Security 中,每一条SecurityFilterChain都匹配一种路径规则,并按顺序持有一条过滤器链,接口如下:

public interface SecurityFilterChain {
 // 是否匹配该请求的
 boolean matches(HttpServletRequest request);
 // 过滤器列表
 List<Filter> getFilters();
}

VirtualFilterChaindoFilter()过滤方法如下:

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中认证和鉴权的流程和结果,过滤器的顺序一般如下:

  1. ChannelProcessingFilter,应对可能出现重定向到其他协议
  2. SecurityContextPersistenceFilter,请求开始的时候在SecurityContextHolder中创建SecurityContext,并且在请求结束的时候清理SecurityContextHolder。在请求结束的时候可以将SecuriytContext复制到HttpSession中以用于下次请求
  3. ConcurrentSessionFilter,使用SecurityContextHolder来更新SessionRegistry中对应当前请求的principal
  4. UsernamePasswordAuthenticationFilteCasAuthenticationFilterBasicAuthenticationFilter,认证处理机制,用于为SecurityContextHolder注入一个经过认证的Authentication
  5. SecurityContextHolderAwareRequestFilter,是用来servlet容器中安装一个spring-security-awareHttpServletRequestWrapper
  6. JaasApiIntegrationFilter,如果一个JaasAuthenticationTokenSecurityContextHolder时,该过滤器将过滤器调用链中的JaasAuthenticationToken的主体
  7. RememberMeAuthenticationFilter,如果前面的认证处理机制没有更新SecurityContextHolder,并且请求中提供了cookie允许记住我服务的发生,那么一个记住我的Authentication将被更新到SecurityContextHolder
  8. AnonymousAuthenticationFilter,如果前面的认证处理机制没有更新SecurityContextHolder,这是表明用户没有登录,那么一个匿名的Authentication将被放置到SecurityContextHolder
  9. ExceptionTranslationFilter,用来catch spring-security-exception用来组装一个HTTP error响应或者加载AuthenticationEntryPoint进行处理
  10. FilterSecurityInterceptor,用于保护资源,是spring-security鉴权的主要过滤器,当访问被拒绝时抛出异常

在spring-security中还有很多其他的过滤器,但是在此就不不一一累述,不然没完没了。以上的Filter继承了InitializingBean,在调用过程中并没有安装它们的标准过滤器生命周期方法执行。官方建议使用spring应用的上下文生命周期接口作为代替,由spring管理这些过滤器的生命周期。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。