アプリケーション・プログラムが、Java Authentication and Authorization Service (JAAS) を使用して、 プログラマチック・ログインを実行する方法を、この例を使って説明します。
LoginContext lc = null; Subject subject = null; try { lc = new LoginContext("WSLogin", new WSCallbackHandlerImpl("userName", "password")); } catch (LoginException le) { System.out.println("Cannot create LoginContext. " + le.getMessage()); // Insert the error processing code } catch(SecurityException se) { // Insert the error processing code } try { lc.login(); subject = lc.getSubject(); // setting the subject on the thread to use for outbound requests. // Note: This overrides the existing subject which you might want to save first. com.ibm.websphere.security.auth.WSSubject.setRunAsSubject(subject); } catch(LoginException le) { System.out.println("Fails to create Subject. " + le.getMessage()); // Insert the error processing code }
例に示されているように、新規のログイン・コンテキストが、 WSLogin ログイン構成および WSCallbackHandlerImpl コールバック・ハンドラーを 使用して初期化されます。プロンプトが望ましくないサーバー・サイド・アプリケーション では、WSCallbackHandlerImpl インスタンスを使用します。 WSCallbackHandlerImpl インスタンスは、指定されたユーザー ID、 パスワードおよびレルム情報により初期化されます。 WSLogin ログイン構成によって指定されている現在の WSLoginModuleImpl クラス・ インプリメンテーションが取得できるのは、 指定されたコールバック・ハンドラーからの認証情報のみです。 ログイン・コンテキストは、Subject オブジェクトにより構成することができますが、 Subject は現在の WSLoginModuleImpl インプリメンテーションによって無視されます。 製品のクライアント・コンテナー・アプリケーションの場合、 WSLogin ログイン構成を、クライアント・コンテナーの要件に 合った WSClientLoginModuleImpl インプリメンテーションを 指定する ClientContainer ログイン構成に置き換えます。
ピュア Java アプリケーション・クライアントの場合、 製品は他に 2 つのコールバック・ハンドラー・インプリメンテーションを提供します。 これは、WSStdinCallbackHandlerImpl および WSGUICallbackHandlerImpl であり、 それぞれコマンド行とポップアップ・パネルでユーザー ID、パスワード、 およびレルム情報の入力を促します。 特定のアプリケーション環境に応じて、これらの製品のコールバック・ハンドラー・ インプリメンテーションのいずれかを選択できます。 これらのインプリメンテーションのいずれもがユーザーの特定のアプリケーション要件に 適合しない場合は、新規のコールバック・ハンドラーを開発することができます。
また、デフォルトの WSLoginModuleImpl インプリメンテーションがすべての 要件を満たさない場合は、独自のログイン・モジュールを作成することもできます。 この製品には、カスタム・ログイン・モジュールにより使用可能なユーティリティー 機能が付属しています。これについては、次のセクションで説明します。
java.naming.provider.url プロパティーが、 システム・プロパティーとして設定されていないか、 あるいは jndi.properties ファイル内にない場合、 製品サーバーが sever_name:2809 ロケーションになければ、 デフォルトの InitialContext コンテキストは機能しません。 この場合には、JAAS ログインの前に新規 InitialContext コンテキストを プログラマチックに構成してください。 JAAS は、commit メソッドを実行する前に、入力されたユーザー ID またはパスワードが 正しいかどうかを検証するためにセキュリティー・サーバーの場所を知る必要があります。 以下に指定する方法で新規 InitialContext コンテキストを構成することによって、 セキュリティー・コードには、セキュリティー・サーバーの場所とターゲット・レルムを 見つけるために必要な情報が入ります。
import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; ... // Perform an InitialContext and default lookup prior to logging in so that target realm // and bootstrap host/port can be determined for SecurityServer lookup. Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); env.put(Context.PROVIDER_URL, "corbaloc:iiop:myhost.mycompany.com:2809"); Context initialContext = new InitialContext(env); Object obj = initialContext.lookup(""); LoginContext lc = null; try { lc = new LoginContext("WSLogin", new WSCallbackHandlerImpl("userName", "realm", "password")); } catch (LoginException le) { System.out.println("Cannot create LoginContext. " + le.getMessage()); // insert error processing code } catch(SecurityException se) { System.out.printlin("Cannot create LoginContext." + se.getMessage(); // Insert error processing } try { lc.login(); } catch(LoginException le) { System.out.printlin("Fails to create Subject. " + le.getMessage()); // Insert error processing code }