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

Java 認証および認可サービス(JAAS)プロバイダー

概要

Spring Security は、認証リクエストを Java Authentication and Authorization Service(JAAS)に委譲できるパッケージを提供します。このパッケージについては、以下で詳しく説明します。

AbstractJaasAuthenticationProvider

AbstractJaasAuthenticationProvider は、提供されている JAAS AuthenticationProvider 実装の基礎です。サブクラスは、LoginContext を作成するメソッドを実装する必要があります。AbstractJaasAuthenticationProvider には、以下で説明する多くの依存関係があります。

JAAS CallbackHandler

ほとんどの JAAS LoginModule には、何らかのコールバックが必要です。これらのコールバックは通常、ユーザーからユーザー名とパスワードを取得するために使用されます。

Spring Security デプロイでは、Spring Security が(認証メカニズムを介して)このユーザー対話を担当します。認証リクエストが JAAS に委譲されるまでに、Spring Security の認証メカニズムは、JAAS LoginModule が必要とするすべての情報を含む Authentication オブジェクトをすでに完全に取り込みました。

Spring Security の JAAS パッケージは、2 つのデフォルトコールバックハンドラー JaasNameCallbackHandler と JaasPasswordCallbackHandler を提供します。これらの各コールバックハンドラーは JaasAuthenticationCallbackHandler を実装します。ほとんどの場合、これらのコールバックハンドラーは、内部の仕組みを理解しなくても簡単に使用できます。

コールバックの動作を完全に制御する必要がある場合、内部で AbstractJaasAuthenticationProvider はこれらの JaasAuthenticationCallbackHandler を InternalCallbackHandler でラップします。InternalCallbackHandler は、JAAS の通常の CallbackHandler インターフェースを実際に実装するクラスです。JAAS LoginModule が使用されるたびに、InternalCallbackHandler で構成されたアプリケーションコンテキストのリストが渡されます。LoginModule が InternalCallbackHandler に対してコールバックをリクエストする場合、コールバックはラップされている JaasAuthenticationCallbackHandler に順番に渡されます。

JAAS AuthorityGranter

JAAS はプリンシパルと連携します。「ロール」でさえ、JAAS のプリンシパルとして表されます。一方、Spring Security は Authentication オブジェクトで機能します。各 Authentication オブジェクトには、単一のプリンシパルと複数の GrantedAuthority が含まれます。これらの異なる概念間のマッピングを容易にするために、Spring Security の JAAS パッケージには AuthorityGranter インターフェースが含まれています。

AuthorityGranter は、JAAS プリンシパルをインスペクションし、プリンシパルに割り当てられた権限を表す String のセットを返す責任があります。返された権限文字列ごとに、AbstractJaasAuthenticationProvider は、権限文字列と AuthorityGranter が渡された JAAS プリンシパルを含む JaasGrantedAuthority (Spring Security の GrantedAuthority インターフェースを実装)を作成します。AbstractJaasAuthenticationProvider は、最初に JAAS LoginModule を使用してユーザーの資格情報を正常に認証し、それが返す LoginContext にアクセスすることにより、JAAS プリンシパルを取得します。LoginContext.getSubject().getPrincipals() の呼び出しが行われ、結果の各プリンシパルが AbstractJaasAuthenticationProvider.setAuthorityGranters(List) プロパティに対して定義された各 AuthorityGranter に渡されます。

すべての JAAS プリンシパルには実装固有の意味があるため、Spring Security には本番 AuthorityGranter は含まれません。ただし、単体テストには、簡単な AuthorityGranter 実装を示す TestAuthorityGranter があります。

DefaultJaasAuthenticationProvider

DefaultJaasAuthenticationProvider では、JAAS Configuration オブジェクトを依存関係として挿入できます。次に、注入された JAAS Configuration を使用して LoginContext を作成します。これは、DefaultJaasAuthenticationProvider が JaasAuthenticationProvider のように Configuration の特定の実装にバインドされていないことを意味します。

InMemoryConfiguration

Configuration を DefaultJaasAuthenticationProvider に挿入しやすくするために、InMemoryConfiguration という名前のデフォルトのメモリ内実装が提供されています。実装コンストラクターは、各キーがログイン構成名を表し、値が AppConfigurationEntry の Array を表す Map を受け入れます。InMemoryConfiguration は、提供された Map 内でマッピングが見つからない場合に使用される AppConfigurationEntry オブジェクトのデフォルト Array もサポートします。詳細については、InMemoryConfiguration のクラスレベルの javadoc を参照してください。

DefaultJaasAuthenticationProvider の構成例

InMemoryConfiguration の Spring 構成は、標準の JAAS 構成ファイルよりも冗長になる可能性がありますが、DefaultJaasAuthenticationProvider と組み合わせて使用すると、デフォルトの Configuration 実装に依存しないため、JaasAuthenticationProvider よりも柔軟性が高くなります。

InMemoryConfiguration を使用した DefaultJaasAuthenticationProvider の構成例を以下に示します。Configuration のカスタム実装は、DefaultJaasAuthenticationProvider にも簡単に挿入できることに注意してください。

<bean id="jaasAuthProvider"
class="org.springframework.security.authentication.jaas.DefaultJaasAuthenticationProvider">
<property name="configuration">
<bean class="org.springframework.security.authentication.jaas.memory.InMemoryConfiguration">
<constructor-arg>
	<map>
	<!--
	SPRINGSECURITY is the default loginContextName
	for AbstractJaasAuthenticationProvider
	-->
	<entry key="SPRINGSECURITY">
	<array>
	<bean class="javax.security.auth.login.AppConfigurationEntry">
		<constructor-arg value="sample.SampleLoginModule" />
		<constructor-arg>
		<util:constant static-field=
			"javax.security.auth.login.AppConfigurationEntry$LoginModuleControlFlag.REQUIRED"/>
		</constructor-arg>
		<constructor-arg>
		<map></map>
		</constructor-arg>
		</bean>
	</array>
	</entry>
	</map>
	</constructor-arg>
</bean>
</property>
<property name="authorityGranters">
<list>
	<!-- You will need to write your own implementation of AuthorityGranter -->
	<bean class="org.springframework.security.authentication.jaas.TestAuthorityGranter"/>
</list>
</property>
</bean>

JaasAuthenticationProvider

JaasAuthenticationProvider は、デフォルトの Configuration が ConfigFile [Oracle] のインスタンスであると想定しています。この仮定は、Configuration を更新しようとするために行われます。JaasAuthenticationProvider は、デフォルトの Configuration を使用して LoginContext を作成します。

JAAS ログイン構成ファイル /WEB-INF/login.conf があり、次の内容があるとします。

JAASTest {
	sample.SampleLoginModule required;
};

すべての Spring Security Bean と同様に、JaasAuthenticationProvider はアプリケーションコンテキストを介して設定されます。次の定義は、上記の JAAS ログイン構成ファイルに対応します。

<bean id="jaasAuthenticationProvider"
class="org.springframework.security.authentication.jaas.JaasAuthenticationProvider">
<property name="loginConfig" value="/WEB-INF/login.conf"/>
<property name="loginContextName" value="JAASTest"/>
<property name="callbackHandlers">
<list>
<bean
	class="org.springframework.security.authentication.jaas.JaasNameCallbackHandler"/>
<bean
	class="org.springframework.security.authentication.jaas.JaasPasswordCallbackHandler"/>
</list>
</property>
<property name="authorityGranters">
	<list>
	<bean class="org.springframework.security.authentication.jaas.TestAuthorityGranter"/>
	</list>
</property>
</bean>

サブジェクトとして実行

構成されている場合、JaasApiIntegrationFilter は JaasAuthenticationToken で Subject として実行しようとします。これは、以下を使用して Subject にアクセスできることを意味します。

Subject subject = Subject.getSubject(AccessController.getContext());

この統合は、jaas-api-provision 属性を使用して簡単に構成できます。この機能は、入力されている JAAS サブジェクトに依存するレガシー API または外部 API と統合する場合に役立ちます。