基本認証
このセクションでは、Spring Security がサーブレットベースのアプリケーションの基本 HTTP 認証 [IETF] (英語) をサポートする方法について詳しく説明します。
このセクションでは、Spring Security 内で HTTP 基本認証がどのように機能するかについて説明します。まず、WWW 認証 [IETF] (英語) ヘッダーが認証されていないクライアントに返送されていることがわかります。
前の図は、SecurityFilterChain
図を基にしています。
最初に、ユーザーが認可されていないリソース /private
に対して認証されていないリクエストを行います。
Spring Security の AuthorizationFilter
は、認証されていないリクエストが AccessDeniedException
をスローすることによって拒否されたことを示します。
ユーザーが認証されていないため、ExceptionTranslationFilter
は認証開始を開始します。構成された AuthenticationEntryPoint
は、WWW-Authenticate ヘッダーを送信する BasicAuthenticationEntryPoint
(Javadoc) のインスタンスです。RequestCache
は通常、クライアントが最初にリクエストしたリクエストを再生できるため、リクエストを保存しない NullRequestCache
です。
クライアントが WWW-Authenticate
ヘッダーを受信すると、ユーザー名とパスワードを使用して再試行する必要があることがわかります。次のイメージは、処理中のユーザー名とパスワードのフローを示しています。
前の図は、SecurityFilterChain
図を基にしています。
ユーザーがユーザー名とパスワードを送信すると、BasicAuthenticationFilter
は HttpServletRequest
からユーザー名とパスワードを抽出することにより、Authentication
の一種である UsernamePasswordAuthenticationToken
を作成します。
次に、UsernamePasswordAuthenticationToken
が AuthenticationManager
に渡され、認証されます。AuthenticationManager
がどのように見えるかの詳細は、ユーザー情報がどのように保存されているかによって異なります。
認証が失敗した場合、Failure。
SecurityContextHolder はクリアされます。
RememberMeServices.loginFail
が呼び出されます。設定されていないことを覚えている場合、これはノーオペレーションです。Javadoc のRememberMeServices
(Javadoc) インターフェースを参照してください。AuthenticationEntryPoint
が呼び出されて、WWW 認証が再度送信されます。Javadoc のAuthenticationEntryPoint
(Javadoc) インターフェースを参照してください。
認証が成功した場合は、Success .
認証は SecurityContextHolder に設定されます。
RememberMeServices.loginSuccess
が呼び出されます。設定されていないことを覚えている場合、これはノーオペレーションです。Javadoc のRememberMeServices
(Javadoc) インターフェースを参照してください。BasicAuthenticationFilter
はFilterChain.doFilter(request,response)
を呼び出して、残りのアプリケーションロジックを続行します。Javadoc のBasicAuthenticationFilter
(Javadoc) クラスを参照してください
デフォルトでは、Spring Security の HTTP 基本認証サポートが有効になっています。ただし、サーブレットベースの構成が提供されるとすぐに、HTTPBasic を明示的に提供する必要があります。
次の例は、最小限の明示的な構成を示しています。
Java
XML
Kotlin
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
http
// ...
.httpBasic(withDefaults());
return http.build();
}
<http>
<!-- ... -->
<http-basic />
</http>
@Bean
open fun filterChain(http: HttpSecurity): SecurityFilterChain {
http {
// ...
httpBasic { }
}
return http.build()
}