spring-security 使用Spring Security控制Sping Boot 应用程序中非安全过滤器的顺序

sh7euo9m  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(169)

我正在构建一个使用Spring Security进行身份验证/授权的REST风格的Web服务。
Spring Security附带了大量自己的灵活且可配置的过滤器。但是,我的服务需要定义几个自己的过滤器:

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

我看到了this answerthis one,但这两个都涉及到配置 other 自定义安全过滤器来与Spring Security的内置过滤器一起工作。我如何配置Sping Boot 来将我的非安全过滤器“定位”在Spring Security的”之后”(过滤器链的更下游)?我如何控制这些过滤器的顺序?

vbkedwbf

vbkedwbf1#

您可以使用@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定义的位置,该位置设置为-100。因此,任何阶数高于-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

将在安全筛选器之后执行

相关问题