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 パッケージは、JaasNameCallbackHandler と JaasPasswordCallbackHandler の 2 つのデフォルトのコールバックハンドラーを提供します。これらの各コールバックハンドラーは 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 を作成します。これは、JaasAuthenticationProvider のように、DefaultJaasAuthenticationProvider が Configuration の特定の実装にバインドされていないことを意味します。

InMemoryConfiguration

Configuration を DefaultJaasAuthenticationProvider に簡単に挿入できるようにするために、InMemoryConfiguration という名前のデフォルトのメモリ内実装が提供されています。実装コンストラクターは Map を受け入れます。ここで、各キーはログイン構成名を表し、値は AppConfigurationEntry インスタンスの Array を表します。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 と統合する場合に役立ちます。