基本認証

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

このセクションでは、Spring Security 内で HTTP 基本認証がどのように機能するかについて説明します。まず、WWW 認証 [IETF] (英語) ヘッダーが認証されていないクライアントに返送されていることがわかります。

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

前の図は、SecurityFilterChain 図を基にしています。

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

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

number 3 ユーザーが認証されていないため、ExceptionTranslationFilter認証開始を開始します。構成された 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

  1. SecurityContextHolder はクリアされます。

  2. RememberMeServices.loginFail が呼び出されます。設定されていないことを覚えている場合、これはノーオペレーションです。Javadoc の RememberMeServices (Javadoc) インターフェースを参照してください。

  3. AuthenticationEntryPoint が呼び出されて、WWW 認証が再度送信されます。Javadoc の AuthenticationEntryPoint (Javadoc) インターフェースを参照してください。

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

  1. 認証SecurityContextHolder に設定されます。

  2. RememberMeServices.loginSuccess が呼び出されます。設定されていないことを覚えている場合、これはノーオペレーションです。Javadoc の RememberMeServices (Javadoc) インターフェースを参照してください。

  3. BasicAuthenticationFilter は FilterChain.doFilter(request,response) を呼び出して、残りのアプリケーションロジックを続行します。Javadoc の BasicAuthenticationFilter (Javadoc) クラスを参照してください

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

次の例は、最小限の明示的な構成を示しています。

明示的な 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()
}