【问题标题】:Controlling the order of non-security Filters in a Spring Boot app using Spring Security使用 Spring Security 控制 Spring Boot 应用程序中非安全过滤器的顺序
【发布时间】:2022-07-29 14:30:18
【问题描述】:

Java + Spring Boot 在这里。我正在构建一个使用 Spring Security 进行身份验证/授权的 RESTful Web 服务。

Spring Security 附带了大量自己的灵活且可配置的过滤器。但是,我的服务需要定义几个自己的过滤器:

  • 它们与安全性完全无关,因此不需要在 Spring Security 的 API 中进行任何配置;和
  • 我确实希望在 Spring Security 已经允许请求通过其所有自己的安全过滤器之后调用它们;这意味着这些“非安全”过滤器只有在 Spring Security 提前允许请求通过时才会被调用

我看到了this answerthis one,但它们都涉及配置其他自定义安全过滤器以与 Spring Security 的内置过滤器一起使用。如何将 Spring Boot 配置为从 Spring Security“定位”我的非安全过滤器“之后”(在过滤器链的下方)?一旦我这样做了,我该如何控制这些过滤器的顺序?

【问题讨论】:

标签: java spring-boot spring-security spring-filter


【解决方案1】:

您可以使用@Order 注释设置过滤器的顺序。它具有默认值Integer.MAX_VALUE 这样您的过滤器将最后执行(较低的值具有较高的优先级)。这是一个例子:

@Order
@Component
public class TestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

Spring Security 是单个物理Filter,但将处理委托给一系列内部过滤器,例如:SecurityContextPersistenceFilter、RememberMeAuthenticationFilter、AnonymousAuthenticationFilter 等。安全过滤器安装在由SecurityProperties.DEFAULT_FILTER_ORDER 定义的位置,该位置设置为@ 987654326@。所以任何阶数大于100的过滤器都会在FilterChainProxy(spring安全过滤器的具体类)之后执行

例如:

@Order(SecurityProperties.DEFAULT_FILTER_ORDER-1)
@Component
public class BeforeSecurityFilter implements Filter

将在安全过滤器之前执行并且:

@Order(SecurityProperties.DEFAULT_FILTER_ORDER+1)
@Component
public class AfterSecurityFilter implements Filter

将在安全过滤后执行

【讨论】:

  • 感谢@eparvan (+1) - 为@Order(value = ??? 设置哪些值是安全的调用 Spring Security 过滤器。这就是这个问题的本质:我如何命令非安全过滤器干扰 Spring Security 过滤器?!
猜你喜欢
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2014-11-15
  • 2017-12-14
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多