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=cord&product=was-libcore-mp&topic=twlp_develop_jaspic
ファイル名: twlp_develop_jaspic.html