簡體   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