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