最新の安定バージョンについては、Spring Security 6.3.1 を使用してください!

基本認証

このセクションでは、Spring Security がサーブレットベースのアプリケーションで基本 HTTP 認証 [IETF] (英語) をどのようにサポートするかについて詳しく説明します。

Spring Security 内で HTTP 基本認証がどのように機能するかを見てみましょう。最初に、WWW 認証 [IETF] (英語) ヘッダーが認証されていないクライアントに送り返されるのを確認します。

basicauthenticationentrypoint
図 1: WWW-Authenticate ヘッダーの送信

この図は、SecurityFilterChain ダイアグラムから構築されています。

number 1 最初に、ユーザーが認可されていないリソース /private に対して認証されていないリクエストを行います。

number 2Spring Security の FilterSecurityInterceptor は、認証されていないリクエストが AccessDeniedException をスローすることによって拒否されたことを示します。

number 3 ユーザーが認証されていないため、ExceptionTranslationFilterStart Authentication を開始します。構成された AuthenticationEntryPoint は、WWW-Authenticate ヘッダーを送信する BasicAuthenticationEntryPoint (Javadoc) のインスタンスです。RequestCache は通常、クライアントが最初にリクエストしたリクエストを再生できるため、リクエストを保存しない NullRequestCache です。

クライアントは、WWW-Authenticate ヘッダーを受信すると、ユーザー名とパスワードで再試行する必要があることを認識します。以下は、処理中のユーザー名とパスワードのフローです。

basicauthenticationfilter
図 2: ユーザー名とパスワードの認証

この図は、SecurityFilterChain ダイアグラムから構築されています。

number 1 ユーザーがユーザー名とパスワードを送信すると、BasicAuthenticationFilter は HttpServletRequest からユーザー名とパスワードを抽出して Authentication の一種である UsernamePasswordAuthenticationToken を作成します。

number 2 次に、UsernamePasswordAuthenticationToken が AuthenticationManager に渡され、認証されます。AuthenticationManager がどのように見えるかの詳細は、ユーザー情報がどのように保存されているかによって異なります。

number 3 認証に失敗した場合、Failure

  • SecurityContextHolder はクリアされます。

  • RememberMeServices.loginFail が呼び出されます。設定されていないことを覚えていれば、これはノーオペレーションです。

  • AuthenticationEntryPoint が呼び出され、WWW-Authenticate が再度送信されます。

number 4 認証が成功した場合は、Success .

  • 認証SecurityContextHolder に設定されます。

  • RememberMeServices.loginSuccess が呼び出されます。設定されていないことを覚えていれば、これはノーオペレーションです。

  • BasicAuthenticationFilter は FilterChain.doFilter(request,response) を呼び出して、残りのアプリケーションロジックを続行します。

Spring Security の HTTP 基本認証のサポートはデフォルトで有効になっています。ただし、サーブレットベースの構成が提供されるとすぐに、HTTP Basic を明示的に提供する必要があります。

最小限の明示的な構成を以下に示します。

明示的な HTTP 基本設定
  • 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()
}