知識庫 / Spring / Spring Security RSS 訂閱

自定義 Spring Security 過濾器鏈中的過濾器

Spring Security
HongKong
4
02:44 PM · Dec 06 ,2025

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();
    }
}

有幾種可能的實現方法:

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 的 SecurityFilterChainRequestMatcher,將過濾器專門應用於受保護端點。

@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 過濾器鏈中。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.