概要
Spring Securityフレームワークのアーキテクチャについてまとめた。
Spring Securityとは
アプリケーションに、セキュリティ対策機能を実装するためのフレームワークとなる。
様々なセキュリティ機能を提供しているが、大きな役割として「認証」「認可」機能を提供している。
・認証機能: 「ユーザーが誰なのかを確認すること(ログイン認証)」
・認可機能: 「そのユーザーがどんな画面 又は どんな機能を利用できるのかを制御すること」
・認可機能: 「そのユーザーがどんな画面 又は どんな機能を利用できるのかを制御すること」
アーキテクチャ
Spring Securityフレームワークのアーキテクチャについて段階的に紹介する。
全体像
Spring Securityでは、「認証」も「認可」も基本的にはサーブレットフィルタの仕組みを利用してセキュリティ機能を提供する。
これらのセキュリティチェック処理は、複数のセキュリティフィルターで構成された処理パッケージ(SecurityFilterChain)内のフィルターによって順次実行される。
① クライアントからのリクエストがサーブレットコンテナに届く
② FilterChainProxyが介入し、SecurityFilterChain内のフィルター群に処理を委譲する
③ SecurityFilterChain内のフィルター群が、順次セキュリティチェック処理を行う
④ 問題があれば適宜、例外ハンドラが呼び出される(認証エラー、認可エラーなど)
⑤ 問題なければ、リクエストがWebアプリのリソースに到達する
② FilterChainProxyが介入し、SecurityFilterChain内のフィルター群に処理を委譲する
③ SecurityFilterChain内のフィルター群が、順次セキュリティチェック処理を行う
④ 問題があれば適宜、例外ハンドラが呼び出される(認証エラー、認可エラーなど)
⑤ 問題なければ、リクエストがWebアプリのリソースに到達する
認証機能
SecurityFilterChain内では以下の流れでログイン時の認証処理を行う。(※フォーム認証の場合)
① クライアントが認証リクエストを行う
② AuthenticationFilter(実装クラス:UsernamePasswordAuthenticationFilter)にて、リクエストからユーザー名・パスワードなどの認証入力情報を取得する
③ AuthenticationManager(実装クラス:ProviderManager)を呼び出し、取得した認証入力情報を渡して認証処理を委譲する
④ 認証方式に対応するAuthenticationProvider(実装クラス:DaoAuthenticationProvider)が呼び出され、入力情報をもとに認証処理を実行する
※UserDetailsServiceを呼び出して「照合対象のユーザー情報(UserDetails)」を取得し、パスワード照合やアカウント状態チェックなどを行う
⑤ 認証に成功した場合、AuthenticationFilterにて認証済みユーザー情報をSecurityContextHolderに登録し、セッションに保存する
⑥ Webリソースへリダイレクトする
② AuthenticationFilter(実装クラス:UsernamePasswordAuthenticationFilter)にて、リクエストからユーザー名・パスワードなどの認証入力情報を取得する
③ AuthenticationManager(実装クラス:ProviderManager)を呼び出し、取得した認証入力情報を渡して認証処理を委譲する
④ 認証方式に対応するAuthenticationProvider(実装クラス:DaoAuthenticationProvider)が呼び出され、入力情報をもとに認証処理を実行する
※UserDetailsServiceを呼び出して「照合対象のユーザー情報(UserDetails)」を取得し、パスワード照合やアカウント状態チェックなどを行う
⑤ 認証に成功した場合、AuthenticationFilterにて認証済みユーザー情報をSecurityContextHolderに登録し、セッションに保存する
⑥ Webリソースへリダイレクトする
認可機能
SecurityFilterChain内では以下の流れで認可処理を行う。
① クライアントが任意のURLへリクエストを行う
② ExceptionTranslationFilterがリクエストを受け取り、AuthorizationFilterを呼ぶ
※このフィルターは認可処理を行わず、認可例外ハンドリングの責務をもつ
③ AuthorizationFilterにて認可処理に必要な以下の情報をSecurityContextHolder(セッション)から取得する
・認証済みユーザー情報
・認可ポリシー(リクエストされたURLへのアクセス権情報)
④ AuthorizationManagerを呼び出して、認証済みユーザー情報と認可ポリシーをもとに、アクセス権があるかどうかチェックを行う
⑤ アクセス権が存在しない場合、認可エラー(AccessDeniedException)をスローする
⑥ アクセス権が存在する場合、Webリソースへのアクセスを許可する
② ExceptionTranslationFilterがリクエストを受け取り、AuthorizationFilterを呼ぶ
※このフィルターは認可処理を行わず、認可例外ハンドリングの責務をもつ
③ AuthorizationFilterにて認可処理に必要な以下の情報をSecurityContextHolder(セッション)から取得する
・認証済みユーザー情報
・認可ポリシー(リクエストされたURLへのアクセス権情報)
④ AuthorizationManagerを呼び出して、認証済みユーザー情報と認可ポリシーをもとに、アクセス権があるかどうかチェックを行う
⑤ アクセス権が存在しない場合、認可エラー(AccessDeniedException)をスローする
⑥ アクセス権が存在する場合、Webリソースへのアクセスを許可する
まとめ
☑ Spring Securityは、Webアプリケーションにセキュリティ機能を組み込むためのフレームワーク
☑ サーブレットフィルターの仕組みを利用して、リクエスト処理の前後にセキュリティ処理を差し込む
☑ 提供する基本的なセキュリティ機能は「認証」と「認可」がある