繁体   English   中英

在 Spring 安全配置中订购定制过滤器

[英]Ordering custom filters in Spring Security configuration

我创建了两个自定义过滤器,一个负责验证 JWT ,一个负责处理ExpiredJwtException

我找到了以正确顺序调用它们的解决方案: Multiple Spring Security filters ,以便正确捕获ExpiredJwtException

http.antMatcher("jwtRequestFilter/exceptionHandlerFilter/**")
                .addFilterBefore(exceptionHandlerFilter, FilterSecurityInterceptor.class)
                .antMatcher("jwtRequestFilter/**")
                .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);

经过一些重构后,我发现我需要让它工作的是:

http.antMatcher("jwtRequestFilter/**")
                .addFilterBefore(exceptionHandlerFilter, FilterSecurityInterceptor.class)
                .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);

但我不明白antMatcher方法在这里是如何工作的。 antMatcher("jwtRequestFilter/exceptionHandlerFilter/**")antMatcher("jwtRequestFilter/**")来保持正确的顺序。

antMatcher中的表达式是如何工作的? **是否表示链中的其他过滤器,表达式开头的jwtRequestFilter是否表示它是最后一个过滤器?

antMatcher方法将匹配传入请求的路径,它与过滤器的名称无关。

来自antMatcher的 Javadoc:

允许将 HttpSecurity 配置为仅在匹配提供的 ant 模式时调用。

这意味着只有当传入请求与您提供的 ant 模式匹配时,才会调用您的自定义过滤器(以及过滤器链的 rest)。

考虑这个例子

http
    .antMatcher("/admin/**")
    .addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class)
    // ...

如果您向 GET "/admin/home" 发出请求,则会调用HttpSecurity ,该请求将由 customFilter 处理。

如果您向 GET "/user/home" 发出请求,则不会调用 HttpSecurity, HttpSecurity不会处理该请求。

要了解 ant 样式路径匹配的工作原理,请参阅AntPathMatcher的 Javadoc。

您需要每个端点的 HttpSecurity 配置。

@Configuration
@Order(1)
public class JwtExceptionHandleConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        final Filter exceptionHandlerFilter = new ExceptionHandlerFilter();

        http.antMatcher("/jwtRequestFilter/exceptionHandlerFilter/**")
            .addFilterBefore(exceptionHandlerFilter, FilterSecurityInterceptor.class);
    }

}
@Configuration
@Order(2)
public class JwtRequestConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        final Filter jwtRequestFilter = new JwtRequestFilter();
        final Filter exceptionHandlerFilter = new ExceptionHandlerFilter();

        http.antMatcher("/jwtRequestFilter/**")
            .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
            .addFilterBefore(exceptionHandlerFilter, FilterSecurityInterceptor.class);

    }
}

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM