[英]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.