クラス FilterChainProxy

java.lang.ObjectSE
org.springframework.web.filter.GenericFilterBean
org.springframework.security.web.FilterChainProxy
実装されたすべてのインターフェース:
jakarta.servlet.Filterorg.springframework.beans.factory.Awareorg.springframework.beans.factory.BeanNameAwareorg.springframework.beans.factory.DisposableBeanorg.springframework.beans.factory.InitializingBeanorg.springframework.context.EnvironmentAwareorg.springframework.core.env.EnvironmentCapableorg.springframework.web.context.ServletContextAware

public class FilterChainProxy extends org.springframework.web.filter.GenericFilterBean
Spring 管理のフィルター Bean のリストに Filter リクエストを委譲します。バージョン 2.0 以降、フィルターチェーンの内容を非常に細かく制御する必要がない限り、アプリケーションコンテキストで FilterChainProxy Bean を明示的に構成する必要はありません。ほとんどの場合、デフォルトの <security:http /> 名前空間構成オプションで適切にカバーされます。

FilterChainProxy は、アプリケーション web.xml ファイルに標準の Spring DelegatingFilterProxy 宣言を追加することにより、サーブレットコンテナーフィルターチェーンにリンクされます。

構成

バージョン 3.1 以降、FilterChainProxy は、SecurityFilterChain インスタンスのリストを使用して構成されます。各インスタンスには、RequestMatcher と、一致するリクエストに適用する必要があるフィルターのリストが含まれます。ほとんどのアプリケーションには 1 つのフィルターチェーンのみが含まれ、名前空間を使用している場合は、チェーンを明示的に設定する必要はありません。より細かい制御が必要な場合は、<filter-chain> 名前空間要素を利用できます。これは、URI パターンと、パターンに一致するリクエストに適用する必要があるフィルターのリスト(コンマ区切りの Bean 名として)を定義します。構成例は次のようになります。

  <bean id="myfilterChainProxy" class="org.springframework.security.web.FilterChainProxy">
      <constructor-arg>
          <util:list>
              <security:filter-chain pattern="/do/not/filter*" filters="none"/>
              <security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/>
          </util:list>
      </constructor-arg>
  </bean>
 
名前 "filter1"、"filter2"、"filter3" は、アプリケーションコンテキストで定義された Filter インスタンスの Bean 名である必要があります。名前の順序は、フィルターが適用される順序を定義します。上に示したように、「フィルター」に値 "none" を使用すると、セキュリティフィルターチェーンからリクエストパターンを完全に除外できます。使用可能な構成オプションの完全なリストについては、セキュリティ名前空間スキーマファイルを参照してください。

リクエストの処理

FilterChainProxy が処理する可能性のある各パターンを入力する必要があります。特定のリクエストの最初の一致は、そのリクエストに適用されるすべての Filter を定義するために使用されます。つまり、最も具体的な一致をリストの一番上に配置し、特定のマッチャーに適用する必要があるすべての Filter がそれぞれのエントリに対して入力されていることを確認する必要があります。FilterChainProxy は、残りのマップエントリを反復処理して、追加の Filter を見つけることはありません。

FilterChainProxy は、Filter.doFilter(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, jakarta.servlet.FilterChain) を呼び出さないことを選択する Filter の通常の処理を考慮します。つまり、元の FilterChainProxy -declared フィルターの残りの部分チェーンは呼び出されません。

ファイアウォールのリクエスト

HttpFirewall インスタンスは、受信リクエストを検証し、一致するための一貫したパス値を提供するラップされたリクエストを作成するために使用されます。デフォルトの実装が防御する攻撃の型の詳細については、StrictHttpFirewall を参照してください。カスタム実装を挿入して、リクエストの内容をより厳密に制御したり、アプリケーションがデフォルトで拒否される特定の型のリクエストをサポートする必要がある場合に注入したりできます。

これは、この保護が必要な場合、Spring Security フィルターを FilterChainProxy と組み合わせて使用する必要があることを意味することに注意してください。web.xml ファイルで明示的に定義しないでください。

FilterChainProxy はファイアウォールインスタンスを使用して、フィルターチェーンにフィードされるリクエストオブジェクトとレスポンスオブジェクトの両方を取得します。そのため、この機能を使用してレスポンスの機能を制御することもできます。リクエストがセキュリティフィルターチェーンを通過すると、reset メソッドが呼び出されます。デフォルトの実装では、これは、セキュリティパターンマッチングに使用される変更された値ではなく、servletPath および pathInfo の元の値がその後に返されることを意味します。

この追加の折り返し機能は FilterChainProxy によって実行されるため、同じフィルターチェーンで複数のインスタンスを使用することはお勧めしません。単一の Filter インスタンスでフィルター Bean をラップするためのユーティリティとして純粋に考えるべきではありません。

フィルターのライフサイクル

サーブレットコンテナーと IoC コンテナーの Filter ライフサイクルの不一致に注意してください。DelegatingFilterProxy Javadocs に従って、サーブレットコンテナーではなく、IoC コンテナーにライフサイクルの管理を許可することをお勧めします。FilterChainProxy は、アプリケーションコンテキストに追加したフィルター Bean の標準フィルターライフサイクルメソッドを呼び出しません。

  • コンストラクターの詳細

  • メソッドの詳細

    • afterPropertiesSet

      public void afterPropertiesSet()
      次で指定:
      インターフェース org.springframework.beans.factory.InitializingBeanafterPropertiesSet 
      オーバーライド:
      クラス org.springframework.web.filter.GenericFilterBeanafterPropertiesSet 
    • doFilter

      public void doFilter(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response, jakarta.servlet.FilterChain chain) throws IOExceptionSE, jakarta.servlet.ServletException
      例外:
      IOExceptionSE
      jakarta.servlet.ServletException
    • getFilters

      public ListSE<jakarta.servlet.Filter> getFilters(StringSE url)
      主にテスト用の簡易メソッド。
      パラメーター:
      url - URL
      戻り値:
      一致するフィルターリスト
    • getFilterChains

      public ListSE<SecurityFilterChain> getFilterChains()
      戻り値:
      受信リクエストと照合されて適用される SecurityFilterChain のリスト。
    • setSecurityContextHolderStrategy

      public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy)
      使用する SecurityContextHolderStrategy を設定します。デフォルトのアクションは、SecurityContextHolder に格納されている SecurityContextHolderStrategy を使用することです。
      導入:
      5.8
    • setFilterChainValidator

      public void setFilterChainValidator(FilterChainProxy.FilterChainValidator filterChainValidator)
      (内部で)構成された各チェーンのフィルターの検証戦略を指定するために使用されます。
      パラメーター:
      filterChainValidator - FilterChainProxy インスタンスをチェックするために初期化中に呼び出されるバリデーターインスタンス。
    • setFilterChainDecorator

      public void setFilterChainDecorator(FilterChainProxy.FilterChainDecorator filterChainDecorator)
      リクエストごとにオリジナルの FilterChain を装飾するために使用

      デフォルトでは、これはフィルターチェーン を FilterChainProxy.VirtualFilterChain で装飾し、セキュリティフィルターを反復処理してから元の チェーン に委譲します。

      パラメーター:
      filterChainDecorator - フィルターチェーン を構築するための戦略
      導入:
      6.0
    • setFirewall

      public void setFirewall(HttpFirewall firewall)
      受信リクエストの検証とラップ(または拒否の可能性)に使用される「ファイアウォール」実装を設定します。ほとんどの要件に対して、デフォルトの実装で十分です。
      パラメーター:
      firewall -
    • setRequestRejectedHandler

      public void setRequestRejectedHandler(RequestRejectedHandler requestRejectedHandler)
      ファイアウォールによって拒否されたリクエストに使用される RequestRejectedHandler を設定します。
      パラメーター:
      requestRejectedHandler - RequestRejectedHandler
      導入:
      5.2
    • toString

      public StringSE toString()
      オーバーライド:
      クラス ObjectSEtoString