登録済みのSpring Securityフィルタを探す

1概要

Spring Securityは一連のサーブレットフィルタに基づいています。各フィルタには特定の役割があり、設定に応じてフィルタが追加または削除されます。

このチュートリアルでは、 登録済みのSpring Security Filtersを見つけるためのさまざまな方法について説明します

2セキュリティデバッグ

まず、リクエストごとに詳細なセキュリティ情報を記録するセキュリティデバッグを有効にします。

debug プロパティを使用してセキュリティデバッグを有効にできます。

@EnableWebSecurity(debug = true)

このようにして、サーバーにリクエストを送信すると、すべてのリクエスト情報がログに記録されます。

セキュリティフィルタチェーン全体を確認することもできます。

Security filter chain:[  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  LogoutFilter
  UsernamePasswordAuthenticationFilter
 //...]----

[[log]]

===  **  3ロギング**

次に、__FilterChainProxy__のログ記録を有効にして、セキュリティフィルタを見つけます。

__application.properties__に次の行を追加することでロギングを有効にできます。

[source,bash,gutter:,true]

logging.level.org.springframework.security.web.FilterChainProxy=DEBUG

これが関連ログです。

[source,bash,gutter:,true]

DEBUG o.s.security.web.FilterChainProxy -/foos/1 at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter' DEBUG o.s.security.web.FilterChainProxy -/foos/1 at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' DEBUG o.s.security.web.FilterChainProxy -/foos/1 at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter' DEBUG o.s.security.web.FilterChainProxy -/foos/1 at position 4 of 12 in additional filter chain; firing Filter: 'LogoutFilter' DEBUG o.s.security.web.FilterChainProxy -/foos/1 at position 5 of 12 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter' …​

[[chain]]

===  **  4プログラムによるフィルタの取得**

これで、登録済みのセキュリティフィルタをプログラムで取得する方法がわかります。

セキュリティフィルタを取得するために__FilterChainProxy__を使用します。**

まず、__springSecurityFilterChain__ Beanを自動配線しましょう。

[source,java,gutter:,true]

@Autowired @Qualifier("springSecurityFilterChain") private Filter springSecurityFilterChain;

ここでは、__FilterChainProxyの代わりに__Filter__型の__springSecurityFilterChain__という名前の__ @ Qualifier__を使用しました。 ____これは、__https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.htmlの__springSecurityFilterChain()__のメソッドが使用されているためです。 #springSecurityFilterChain  - [WebSecurityConfiguration]、__はSpring Securityフィルタチェーンを作成し、__FilterChainProxy.__ではなく__Filter__型を返す

次に、このオブジェクトを__FilterChainProxy__にキャストし、__getFilterChains()__メソッドを呼び出します。

[source,java,gutter:,true]

public void getFilters() { FilterChainProxy filterChainProxy = (FilterChainProxy) springSecurityFilterChain; List<SecurityFilterChain> list = filterChainProxy.getFilterChains(); list.stream() .flatMap(chain → chain.getFilters().stream()) .forEach(filter → System.out.println(filter.getClass())); }

これが出力例です。

[source,bash,gutter:,true]

class org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter class org.springframework.security.web.context.SecurityContextPersistenceFilter class org.springframework.security.web.header.HeaderWriterFilter class org.springframework.security.web.authentication.logout.LogoutFilter class org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter …​

Spring Security 3.1以降、**  __FilterChainProxy__は__SecurityFilterChainのリストを使用して設定されていることに注意してください。

[[filter]]

===  **  5重要な春のセキュリティフィルタ**

最後に、重要なセキュリティフィルタをいくつか見てみましょう。

**  __UsernamePasswordAuthenticationFilter__:プロセス認証

デフォルトで「/login」URLに応答します
**  __AnonymousAuthenticationFilter__:認証オブジェクトがない場合

SecurityContextHolderでは、匿名認証オブジェクトを作成します。
そしてそれを置く
**  __FilterSecurityInterceptor:__アクセスが拒否されたときに例外を発生させる

**  __ExceptionTranslationFilter__:Spring Securityの例外をキャッチする

===  **  6. 結論**

この簡単な記事では、登録されているSpring Securityのフィルタをプログラムでログを使用して見つける方法について説明しました。

いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-boot[over on GitHub]にあります。