スプリングセキュリティアーキテクチャの基礎


認証と認証は、Webアプリケーションのセキュリティの基本です.認証がシステムによって識別されることができるかどうか、認証が決定する間、認可はユーザーが特定のリソースへのアクセスを有するかどうか決定する.
認証と同様に認証設計パラダイムは継続的に発展している.その背後にある主な理由は、アプリケーションに対して使用される悪用の異なる方法での連続進化です.
春のセキュリティは、すべての可能な解決策をまとめることによってこの問題を解決しようとします.

The purpose of this article is to provide a high level understanding of spring security architecture for Servlet applications. It may not help you to immediately implement spring security in your application but it would definitely help you in the subsequent steps when you dive deeper.


春の保安におけるフィルタパターン


WebアプリケーションのSpringセキュリティでは、異なる種類のセキュリティソリューションを実装するフィルターパターンを使用します.中身はサーブレットですfilters . Spring FrameworkDelegatingFilterProxy フィルタとスプリングのセキュリティを追加FilterChainProxy その上にフィルターをかける.両方のこれらのフィルタは、春のセキュリティで重要です.
Springセキュリティフィルタアーキテクチャ

デリゲートフィルタ


サーブレットフィルタと同様に、スプリングセキュリティフィルタが実装されていますFilter インターフェースですが、春の豆でもありますApplicationContext .
これらのフィルタはServletコンテナの標準(Web . xmlで構成されている)を介して登録されていないため、サーブレットコンテナはそれらを認識しません.
DelegatingFilterProxy フィルタチェーンにあるフィルタ.それは、サーブレットコンテナライフサイクルと春を架橋しますApplicationContext .
要求が委任されるときDelegatingFilterProxy . アプリケーションコンテキストからBeanフィルタを検索し、関連するBeanフィルタを呼び出します.DelegatingFilterProxy フィルタも遅延ビーンフィルタのルックアップを可能にします.

フィルタリングフィルタ


Spring Securityは次のような特殊なbeanフィルタを提供しますFilterChainProxy . このフィルタは、WebアプリケーションのSpringセキュリティを有効にする単一のエントリポイントです.
これは、フィルタリングのセットを介して要求を委任することができます束SecurityFilterChain . どのスプリングセキュリティフィルタを起動するかを決定するにはFilterChainProxy 用途SecurityFilterChain . そこに複数のSecurityFilterChains 現在FilterChainProxy また、クリアリングなどのセキュリティ固有のタスクを実行するためにも使用されますSecurityContext . FilterChainProxy 従来のサーブレットフィルタより柔軟です.これはsecurityFilterchain を活用して呼び出すRequestMatcher インターフェイス.

セキュリティ


これは、スプリング管理された豆であるセキュリティフィルタのリストです.これらはfilterchainproxyで登録されています.登録される利点SecurityFilterChain 次のようになります.FilterChainProxy 活用するRequestMatcher 何かに基づいて呼び出しを決定するインターフェースServletRequest URLを含む.複数のSecurityFilterChains , FilterChainProxySecurityFilterChain 使用する必要があります.また、クリアSecurityContext 任意のメモリリークを避けるために.

デフォルトのセキュリティをカスタマイズする


SpringセキュリティのインスタンスWebSecurity 経由WebSecurityConfiguration . WebSecurity のインスタンスを作成するFilterChainProxy フィルタ.
我々は、カスタマイズ機能を作成することができます-
  • どちらか拡大WebSecurityConfigurerAdapter そして、それを構成として公開すること
  • または実装WebSecurityConfigurer そして、それを設定として公開します.
  • この設定は@EnableWebSecurity 注釈.

    認証エントリ

  • クライアントが認証資格証明なしでリクエストを送ると、AuthenticationEntryPoint クライアントのレスポンスを送信し、資格情報を要求します.
  • The AuthenticationEntryPoint 実装は、ログインページへのリダイレクトを実行し、WWW認証Eヘッダーなどで応答することがあります.

    フィルタリング


    これはリクエストを認証するためのベースフィルタです.ユーザリクエストが
  • 事前に資格情報がある場合は、AbstractAuthenticationProcessingFilter が直接呼び出されます.
  • 資格情報が設定されていない場合、AuthenticationEntryPoint クライアントから資格情報を要求する最初に呼び出されます
  • その後AbstractAuthenticationProcessingFilter が直接呼び出されます.
  • 認証アーキテクチャ


    認証マネージャー


    これは、認証を実行するAPIを提供する戦略インターフェイスです.これは、春のセキュリティフィルタによって呼び出されます.The authentication 返されるオブジェクトはSecurityContextHolder .
    基本的に認証をチェックし
  • 原則が有効ならば
  • 原理が無効なら
  • 認証がNULLなら
  • Incase、セキュリティフィルタは、ユーザー定義のフィルタを使用するときなど、使用されません.Authentication 設定できますSecurityContextHolder 手動で.

    providermanager


    それは一般的な実装ですAuthenticationManager . のリストに委任AuthenticationProvider S .各AuthenticationProvider それはできないことを示すためにだけでなく、認証する機会があります.
    また、オプションの親AuthenticationManager . もしAuthenticationProvider が与えられた場合、親AuthenticationManager 認証のために相談されます.
    もしauthenticationProviders 認証が失敗すると認証が失敗します.

    認証プロバイダー


    その実装は特定のタイプの認証を実行します.例えば、DaoAuthenticationProvider サポートユーザ名/パスワードベースの認証中JwtAuthenticationProvider JWTトークンの認証をサポートします.

    セキュリティ


    このオブジェクトはリクエストに関する認証情報を含んでいます.
    含むSecurityContext デフォルトではthreadLocal オブジェクト.このようにすべてのリクエストスレッドは独自のSecurityContext オブジェクト.
    セキュリティAPI

    セキュリティコンテキスト


    The securityContext オブジェクトAuthentication オブジェクト.The Authentication オブジェクトは、Spring Securityの中で2つの主要な目的に役立ちます
    それは入力として機能するAuthenticationManager 認証を提供するには、ユーザーが認証を行う必要があります.
      AuthenticationManager.authenticate(Authentication authentication)
    
    
    また、現在認証されたユーザを表します.現在Authentication から得ることができますSecurityContext.
      SecurityContextHolder.getContext().getAuthentication()
    
    
    認証は認証済みユーザについて以下の詳細を提供します.
  • Principal — はユーザを識別する.ユーザ名/パスワードで認証するとき、これはしばしばUserDetails インターフェイス.
  • Credentials — 基本的にパスワード
  • GrandtedAuthorities — プリンシパルの承認スコープを提供します.それは認可のための細粒度スコープです.GrantedAuthorities から得ることができますAuthentication.getAuthorities() メソッド.
  • あなたがこれまでに達して、春の保安に関してより探検したいならば.ここではいくつかの記事をあなたが行くを取得します.
  • username and password authentication using form-based login
  • In-Memory Authentication using DaoAuthenticationProvider
  • JPA implemenation of UserDetailsService For DaoAuthenticationProvider