
![[8.5.5.6 以降]](../ng_v8556.gif)
Liberty プロファイルのカスタム JASPIC 認証プロバイダーの開発
JSR 196: Java™ Authentication Service Provider Interface for Containers 仕様に記述されている必要なインターフェースを実装するクラスを作成することによって、 カスタム Java Authentication SPI for Containers (JASPIC) 認証プロバイダーを開発することができます。
始める前に
このタスクについて
WebSphere Application Server Liberty プロファイルは、 Java Authentication SPI for Containers (JASPIC) バージョン 1.1 に指定されたサーブレット・コンテナー・プロファイルに対応するサード・パーティー認証プロバイダーの使用をサポートします。
サーブレット・コンテナー・プロファイルにはインターフェースが定義されており、 セキュリティー・ランタイム環境はそれらのインターフェースを WebSphere® Application Server 内の Web コンテナーと連携して使用して、 アプリケーションが Web 要求を処理する前後に認証モジュールを呼び出します。JASPIC モジュールを使用する認証は、 セキュリティー構成で JASPIC が有効にされている場合のみ実行されます。
カスタム認証プロバイダーを開発するには、 JSR 196: Java Authentication Service Provider Interface for Containers 仕様に記述されている必要なインターフェースを実装するクラスを作成します。1 つのプロバイダーが認証のために 1 つ以上の認証モジュールを使用できます。モジュールは、 認証を実行するためにコールバックを使用するか、または、必要なユーザー ID 情報をクライアント・サブジェクトに手動で追加できます。
手順
- javax.security.auth.message.config.AuthConfigProvider インターフェースを実装するクラスを作成します。 AuthConfigProvider 実装クラスは、次のように、 2 つの引数を持つ public コンストラクターと、getServerAuthConfig public メソッドを定義する必要があります。
import java.util.Map; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.message.AuthException; import javax.security.auth.message.config.AuthConfigFactory; import javax.security.auth.message.config.AuthConfigProvider; import javax.security.auth.message.config.ServerAuthConfig; public class SampleAuthConfigProvider implements AuthConfigProvider { public SampleAuthConfigProvider(Map<String, String> properties, AuthConfigFactory factory) { ... } public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException { ... } }
アプリケーションの Web モジュールによって処理される要求が到着すると、AuthConfigProvider 実装クラスのインスタンスが WebSphere Application Server によって使用されます。ServerAuthConfig インスタンスを取得するために getServerAuthConfig メソッドが使用されます。メソッド呼び出しの CallbackHandler 引数は authentication モジュールによって使用されます。
- javax.security.auth.message.config.ServerAuthConfig インターフェースを実装するクラスを作成します。 ServerAuthConfig 実装クラスは、public メソッド getAuthContextID および getAuthContext を定義する必要があります。
import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.config.ServerAuthConfig; import javax.security.auth.message.config.ServerAuthContext; public class SampleServerAuthConfig implements ServerAuthConfig { public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException { ... } public ServerAuthContext getAuthContext(String authContextID, Subject serviceSubject, Map properties) throws AuthException { ... } }
ServerAuthConfig 実装クラスの getAuthContextID メソッドおよび getAuthContext メソッドは、ServerAuthContext インスタンスを取得するために使用されます。
- javax.security.auth.message.config.ServerAuthContext インターフェースを実装するクラスを作成します。 ServerAuthContext 実装クラスは、 public メソッド validateRequest および secureResponse を定義する必要があります。
import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.config.ServerAuthContext; public class SampleServerAuthContext implements ServerAuthContext { public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... } public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException { ... } }
ServerAuthContext 実装クラスの validateRequest メソッドは、受信した Web 要求メッセージを認証するモジュールを呼び出すために使用されます。 認証の結果が成功の場合、Web コンテナーは受信した Web 要求メッセージをディスパッチし、 それをターゲット Web モジュールがアプリケーション内で処理します。認証の結果が成功でない場合、 要求は適切な応答状況でリジェクトされます。
- javax.security.auth.message.module.ServerAuthModule インターフェースを実装するクラスを作成します。 ServerAuthModule 実装クラスは、public メソッド initialize、validateRequest、 および secureResponse を定義する必要があります。
import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.MessagePolicy; import javax.security.auth.message.module.ServerAuthModule; public class SampleAuthModule implements ServerAuthModule { public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, Map options) throws AuthException { ... } public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... } public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException { ... } public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException { ... } }
ServerAuthModule 実装クラスの initialize メソッドは、 authentication モジュールを初期化してそれを ServerAuthContext インスタンスと関連付けるために、ServerAuthContext 実装クラスによって呼び出されます。
このクラスの validateRequest メソッドおよび secureResponse メソッドは、 受信した javax.security.auth.message.MessageInfo に含まれている javax.servlet.http.HttpServletRequest および javax.servlet.http.HttpServletResponse を認証するために使用されます。これらのメソッドは、initialize メソッドで受信した CallbackHandler インスタンスを使用して、 ユーザー・パスワードを検証するために WebSphere セキュリティー・ランタイムと対話し、 ユーザーの固有 ID およびメンバーシップ・グループを取得するためにアクティブ・ユーザー・レジストリーと対話することができます。取得したデータは クライアント・サブジェクト内の秘密資格情報のセット内の Hashtable に入れられます。CallbackHandler の WebSphere Application Server 実装は、 以下の 3 つのコールバックをサポートします。- CallerPrincipalCallback
- GroupPrincipalCallback
- PasswordValidationCallback
WebSphere Application Server は、 PasswordValidationCallback.getUsername() と CallerPrincipalCallback.getName() で取得される名前値が同一であると想定します。そうでない場合、予測不能な結果が発生します。CallbackHandler の handle() メソッドは、 メソッドの引数配列で指定された各コールバックを順に処理します。したがって、 クライアント・サブジェクトの秘密資格情報に設定される名前値は、最後に処理されたコールバックから取得されたものです。
CallbackHandler が認証モジュールによって使用されず、validateRequest が成功状況を戻す場合、 WebSphere Application Server は、カスタム・ログインを実行してユーザーの資格情報を取得できるように、 Hashtable インスタンスがユーザー ID 情報と共に clientSubject に含まれていることを必要とします。次の例のようにして、 この Hashtable をクライアント・サブジェクトに追加できます。import java.util.Hashtable; import java.util.String; import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import com.ibm.wsspi.security.registry.RegistryHelper; import com.ibm.wsspi.security.token.AttributeNameConstants.AttributeNameConstants; public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... UserRegistry reg = RegistryHelper.getUserRegistry(null); String uniqueid = reg.getUniqueUserID(username); Hashtable hashtable = new Hashtable(); hashtable.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uniqueid); hashtable.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username); hashtable.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, password); hashtable.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groupList); //optional clientSubject.getPrivateCredentials().add(hashtable); ... }
Hashtable 要件およびカスタム・ログインについて詳しくは、 『システム・ログイン構成用の JAAS カスタム・ログイン・モジュールの開発』を参照してください。

インフォメーション・センターに関するご使用条件 | フィードバック

http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_develop_jaspic
ファイル名: twlp_develop_jaspic.html