1. 概述
在本快速教程中,我們將重點介紹如何為 Spring Security 過濾器鏈編寫自定義過濾器。
2. 創建過濾器
Spring Security 默認提供了一些過濾器,這些過濾器通常已經足夠使用。
當然,有時需要通過創建新的過濾器來在鏈中實現新的功能。
我們首先將實現 org.springframework.web.filter.GenericFilterBean。
GenericFilterBean 是一個 Spring 感知的 javax.servlet.Filter 實現。
我們只需要實現一個方法:
public class CustomFilter extends GenericFilterBean {
@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}
}3. 使用安全配置中的過濾器
我們可以選擇使用 XML 配置或 Java 配置將過濾器集成到 Spring Security 配置中。
3.1. Java 配置
我們可以通過創建 SecurityFilterChain Bean 來程序化註冊過濾器。
例如,它與在 HttpSecurity 實例上使用 addFilterAfter 方法一起工作:
@Configuration
public class CustomWebSecurityConfigurerAdapter {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.addFilterAfter(
new CustomFilter(), BasicAuthenticationFilter.class);
return http.build();
}
}
有幾種可能的實現方法:
- addFilterBefore(filter, class) 在指定 filter 的位置之前添加一個 。
- addFilterAfter(filter, class) 在指定 filter 的位置之後添加一個 。
- addFilterAt(filter, class) 在指定 filter 的位置上添加一個 。
- addFilter(filter) 添加一個 ,該 必須是 Spring Security 提供的一組 filter 的實例或擴展類。
3.2. XML 配置
我們可以使用 <em >custom-filter</em > 標籤和以下名稱之一來將過濾器添加到鏈中,以指定過濾器的位置:這些名稱。
例如,可以使用 `after> 屬性來指定:
<http>
<custom-filter after="BASIC_AUTH_FILTER" ref="myFilter" />
</http>
<beans:bean id="myFilter" class="com.baeldung.security.filter.CustomFilter"/>以下是指定過濾器在堆棧中確切放置位置的所有屬性:
- after 描述了自定義過濾器將放置在鏈中的位置,即過濾器立即之後。
- before 定義了我們的過濾器在鏈中的位置,即過濾器之前。
- position 允許通過顯式位置替換標準過濾器為自定義過濾器。
4. 只在受保護端點應用 Spring Security 過濾器
現代應用程序通常同時提供公共端點和受保護端點。在全局應用自定義 Spring Security 過濾器可能會導致公共端點不必要的處理。為了解決這個問題,我們可以通過使用 Spring Security 的 SecurityFilterChain 和 RequestMatcher,將過濾器專門應用於受保護端點。
@Bean
public SecurityFilterChain securedFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry ->
authorizationManagerRequestMatcherRegistry.requestMatchers("/secured/**").authenticated())
.httpBasic(Customizer.withDefaults());
http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class);
return http.build();
}此配置確保安全設置僅應用於匹配 /secured/** 的端點,如 requestMatchers(“/secured/**”) 所指定。
`addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class)` 這一行確保自定義過濾器在 BasicAuthenticationFilter 之後執行,這意味着它只會執行在基本身份驗證過程之後。
這種方法允許在受保護的端點上進行有針對性的安全處理,而不會影響公共端點。所有對 /secured/** 的請求都需要身份驗證,如 .authorizeHttpRequests() 強制執行。
通過使用自定義 SecurityFilterChain,我們可以隔離這些安全設置,保持應用程序的安全模塊化和高效。 此設置可以防止公共端點上的不必要開銷,並確保受保護路徑(例如身份驗證入口點中的自定義失敗響應)的定製身份驗證處理。
結論
在本文中,我們創建了一個自定義過濾器,並將其連接到 Spring Security 過濾器鏈中。