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

登録済みのSpring Securityフィルターを見つける

1. 概要

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

このチュートリアルでは、we’ll discuss different ways to find the registered Spring Security Filters

2. セキュリティデバッグ

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

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

@EnableWebSecurity(debug = true)

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

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

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

3. ロギング

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

application.propertiesに次の行を追加することで、ログを有効にできます。

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

関連するログは次のとおりです。

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'
...

4. プログラムでフィルターを取得する

次に、登録済みのセキュリティフィルタをプログラムで取得する方法を説明します。

FilterChainProxyを使用してセキュリティフィルタを取得します。

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

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

ここでは、FilterChainProxy. の代わりにspringSecurityFilterChainという名前の@QualifierをタイプFilterで使用しました。これは、WebSecurityConfiguration,springSecurityFilterChain()のメソッドがSpring Securityフィルターチェーン、戻り値の型Filterであり、FilterChainProxy.ではありません

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

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

そして、ここにサンプル出力があります:

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 is configured using a list of SecurityFilterChain.ただし、ほとんどのアプリケーションに必要なSecurityFilterChain.は1つだけです。

5. 重要なスプリングセキュリティフィルター

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

  • UsernamePasswordAuthenticationFilter:認証を処理し、デフォルトで「/ login」URLに応答します

  • AnonymousAuthenticationFilter:SecurityContextHolderに認証オブジェクトがない場合、匿名の認証オブジェクトを作成してそこに配置します

  • FilterSecurityInterceptor:は、アクセスが拒否されたときに例外を発生させます

  • ExceptionTranslationFilter:SpringSecurity例外をキャッチ

6. 結論

この「クイック」記事では、登録されたSpring Securityフィルターをプログラムで検索し、ログを使用する方法を検討しました。

いつものように、ソースコードはover on GitHubで見つけることができます。