spring安全配置中的java定制过滤器

9gm1akwq  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(222)

我创建了两个自定义过滤器,一个负责验证jwt,另一个负责处理jwt ExpiredJwtException .
我找到了按正确顺序调用它们的解决方案:多个spring安全过滤器,这样 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 在表达式的开头表示它是最后一个筛选器?

bybem2ql

bybem2ql1#

这个 antMatcher 方法将匹配传入请求的路径,它与筛选器的名称无关。
来自javadoc的 antMatcher :
允许将httpsecurity配置为仅在匹配提供的ant模式时调用。
这意味着只有当传入的请求与您提供的ant模式匹配时,才会调用您的定制过滤器(以及过滤器链的其余部分)。
考虑一下这个例子

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

如果您请求获取“/admin/home”,那么 HttpSecurity 请求将由customfilter处理。
如果您请求获取“/user/home”,那么 HttpSecurity 不会被调用customfilter不会处理请求。
要了解ant样式的路径匹配是如何工作的,请参阅antpathmatcher的javadoc。

pdkcd3nj

pdkcd3nj2#

您需要为每个端点配置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);

    }
}

另请参见:
16.3. 多httpsecurity

相关问题