ナビゲーションをスキップ

WebLogic Security プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

Java クライアントでの JAAS 認証の使用

この節では、以下の内容について説明します。

 


JAAS と WebLogic Server

Java Authentication and Authorization Service (JAAS) は、Java Software Development Kit バージョン 1.4.1 のセキュリティに対する標準拡張です。JAAS では、ユーザの ID に基づいてアクセス制御を実行できます。JAAS は、JNDI 認証メカニズムの代わりとして WebLogic Server で提供されています。

WebLogic Server クライアントは、標準の JAAS の認証部分だけを利用します。JAAS LoginContext は、コンフィグレーションされているすべての認証プロバイダの LoginModule インスタンスを順番どおりに実行し、コンフィグレーションされている各プロバイダの完了ステータスの管理を行います。

Java クライアントに対して JAAS 認証を使用する場合は、次のことに注意してください。

JAAS の詳細については、Web 上の http://java.sun.com/security/jaas/doc/api.html にある『Java Authentication and Authorization Service Developer's Guide』を参照してください。

 


JAAS 認証の開発環境

クライアントがアプリケーション、アプレット、エンタープライズ JavaBean (EJB)、または認証が必要なサーブレットのどれであるかに関係なく、WebLogic Server は Java Authentication and Authorization Service (JAAS) のクラスを使用して安全かつ確実にそのサーバに対して認証を行います。JAAS は、プラグイン可能な認証モジュール (PAM) フレームワークの Java バージョンを実装します。このフレームワークにより、アプリケーションは基の認証技術から独立することができます。このため、PAM フレームワークを利用することで、Java アプリケーションに修正を加えることなく新しいまたは最新版の認証技術を使用することができます。

WebLogic Server は、リモートの Java クライアントの認証および内部の認証で JAAS を使用します。したがって、JAAS に直に関与する必要があるのは、カスタム認証プロバイダの開発者と Java クライアント アプリケーションの開発者だけです。Web ブラウザ クライアントのユーザまたはコンテナ内の Java クライアント アプリケーション (サーブレットからエンタープライズ JavaBean を呼び出すものなど) の開発者は、JAAS を直接使用したり、その知識を身につけたりする必要はありません。

注意 : Java Authentication and Authorization Service (JAAS) および Java Naming And Directory Interface (JNDI) は、いずれもセキュリティが確保された状態で WebLogic Server のインスタンスへログインするために、WebLogic Server 上で実行される Java クライアントで使用できますが、JAAS のほうが望ましい方法です。

注意 : WebLogic クライアントでセキュリティを実装するためには、Java クライアントで WebLogic Server ソフトウェア配布キットをインストールする必要があります。

この節では、以下の内容について説明します。

JAAS 認証 API

WebLogic Server で JAAS 認証を使用する Java クライアントを実装するには、Java SDK 1.4.1 アプリケーション プログラミング インタフェース (API) と WebLogic API を組み合わせて使用します。

表 3-1 では、JAAS 認証の実装に使用される Java SDK API パッケージについて説明します。表 3-1 の情報は Java SDK API のマニュアルから取られており、WebLogic Server 固有の情報がコメントで追加されています。Java SDK API の詳細については、「http://java.sun.com/j2se/1.4.1/docs/api/index.html」および「http://java.sun.com/j2ee/1.4/docs/api/index.html」の Javadoc を参照してください。

表 3-2 では、JAAS 認証の実装に使用される WebLogic API について説明します。詳細については、「WebLogic クラスの Javadoc」を参照してください。

表 3-1 Java SDK JAAS API

Java SDK JAAS API

説明

javax.security.auth.Subject

Subject クラスは、リクエストのソースを表し、個々のユーザでもグループでも使用できる。Subject オブジェクトは、ユーザのログインが正常に完了した後でのみ作成される。

javax.security.auth.login.
LoginContext

LoginContext クラスは、Subject の認証に使用される基本メソッドを記述し、基礎となる認証テクノロジから独立したアプリケーションを開発する方法を提供する。Configuration では、特定のアプリケーションで使用する認証テクノロジまたは LoginModule を指定する。したがって、アプリケーション自体を変更せずに、異なる LoginModule をアプリケーションに組み込むことができる。

呼び出し側は、LoginContext をインスタンス化すると、login メソッドを呼び出して Subject を認証する。この login メソッドは、呼び出し側で指定した名前についてコンフィグレーションされた LoginModule の各々からの login メソッドを呼び出す。

login メソッドが例外を送出することなく返れば、認証は総合的に成功したことになる。呼び出し側はその後、getSubject メソッドを呼び出すことによって、新しく認証された Subject を取得できる。Subject と関連付けられたプリンシパルおよび資格は、SubjectgetPrincipalsgetPublicCredentials、および getPrivateCredentials メソッドをそれぞれ呼び出すことで取得できる。

Subject からログアウトするには、呼び出し側は logout メソッドを呼び出すだけでよい。login メソッドの場合と同じく、この logout メソッドはこの LoginContext についてコンフィグレーションされた各 LoginModule に対し logout メソッドを呼び出す。

このクラスの実装サンプルについては、コード リスト 3-4 を参照。

javax.security.auth.login.
Configuration

これは、アプリケーションにおける LoginModule のコンフィグレーションを表す抽象クラスである。Configuration では、特定のアプリケーションについて、使用する LoginModule、および LoginModule を呼び出す順番を指定する。この抽象クラスは、実際のコンフィグレーションを読み取ってロードする実装を提供するようサブクラス化する必要がある。

WebLogic Server では、このクラスの代わりにログイン コンフィグレーション ファイルを使用する。 サンプルのコンフィグレーション ファイルについては、コード リスト 3-3 を参照。デフォルトでは、WebLogic Server はコンフィグレーション ファイルから読み取りを行う、Sun Microsystems, Inc. によるコンフィグレーション クラスを使用する。

javax.security.auth.spi.
LoginModule

LoginModule は、認証テクノロジ プロバイダによって実装されるインタフェースを記述する。LoginModule は、特定のタイプの認証を提供するためにアプリケーションに組み込まれる。

アプリケーション開発者は LoginContext API に書き込み、API 認証テクノロジ プロバイダは LoginModule インタフェースを実装する。Configuration では、特定のログイン アプリケーションで使用する LoginModule を指定する。したがって、アプリケーション自体を変更せずに、異なる LoginModule をアプリケーションに組み込むことができる。

注意 : WebLogic Server は、LoginModule の実装 (weblogic.security.auth.login.
UsernamePasswordLoginModule
) を提供する。WebLogic Server の Java クライアントでは、この JAAS 認証の実装の使用が望ましいが、独自の LoginModule を開発することも可能。コード リスト 3-3 は、WebLogic Server の LoginModule を呼び出す方法を示す。

javax.security.auth.
callback.Callback

このインタフェースの実装は CallbackHandler に渡される。それにより、基礎となるセキュリティ サービスは呼び出し側アプリケーションと対話して、ユーザ名やパスワードなど特定の認証データを取得したり、エラーや警告メッセージなど特定の情報を表示できるようになる。

Callback 実装では、基礎となるセキュリティ サービスによって要求された情報の取得または表示は行わない。Callback 実装は、単にそのようなリクエストをアプリケーションに渡す手段と、場合に応じてアプリケーションが要求された情報を基礎となるセキュリティ サービスに返す手段を提供する。

このクラスの実装サンプルについては、コード リスト 3-2 を参照。

javax.security.auth.
callback.CallbackHandler

アプリケーションは、CallbackHandler を実装し、それを基礎となるセキュリティ サービスに渡すことで、それらのサービスがアプリケーションと対話してユーザ名やパスワードなど特定の認証データを取得したり、エラーや警告メッセージなど特定の情報を表示したりできるようにする。

CallbackHandler は、アプリケーションに依存する形で実装される。

基礎となるセキュリティ サービスは、個々の CallbacksCallbackHandler に渡すことによってさまざまなタイプの情報に対するリクエストを行う。CallbackHandler 実装は、渡された Callbacks に応じて情報を取得したり表示したりする方法を決定する。たとえば、基礎となるサービスがユーザを認証するためにユーザ名とパスワードを必要としていれば、NameCallback および PasswordCallback を使用する。その後、CallbackHandler は逐次的にユーザ名およびパスワードの入力を求めるか、または単一のウィンドウで両方の入力を求めるかを選択できる。

このインタフェースの実装サンプルについては、コード リスト 3-2 を参照。


 

表 3-2 WebLogic JAAS API

WebLogic JAAS API

説明

weblogic.security.auth.Authenticate

ユーザ資格の認証に使用される認証クラス。

LoginModule の WebLogic 実装 (weblogic.security.auth.login.
UsernamePasswordLoginModule
) では、このクラスを使用してユーザを認証し、PrincipalsSubject に追加する。ユーザの記述による LoginModule も、同じ目的でこのクラスを使用する必要がある。

weblogic.security.auth.
Callback.URLCallback

基礎となるセキュリティ サービスでは、このクラスを使用して URLCallback をインスタンス化し、CallbackHandlerinvokeCallback メソッドに渡して、URL 情報を取得する。

LoginModule の WebLogic Server 実装 (weblogic.security.auth.login.
UsernamePasswordLoginModule
) ではこのクラスを使用する。

注意 : アプリケーション開発者は、URL 情報の取得にこのクラスを使用すべきではない。代わりに、weblogic.security.URLCallbackHandler を使用する。

weblogic.security.Security

このクラスは WebLogic Server クライアントの runAs メソッドを実装する。クライアント アプリケーションは、実行する PrivilegedAction または PrivilegedExceptionActionSubject ID を、runAs メソッドを使用して関連付ける。

サンプルの実装については、コード リスト 3-6 を参照。

weblogic.security.
URLCallbackHandler

アプリケーション開発者が usernamepassword、および URL を返すために使用するクラス。アプリケーション開発者は、このクラスを使用して URLCallback を処理し、URL 情報を取得する。


 

JAAS クライアント アプリケーション コンポーネント

JAAS 認証クライアント アプリケーションには、少なくとも以下のコンポーネントが含まれます。

ここで説明しているコンポーネントを実装する完全な実践的 JAAS 認証クライアントについては、WebLogic Server で提供されている SAMPLES_HOME\server\examples\src\examples\security\jaas ディレクトリの JAAS サンプル アプリケーションを参照してください。

JAAS 認証の基本の詳細については、Sun の『JAAS Authentication Tutorial』(http://java.sun.com/j2se/1.4/docs/guide/security/jaas/tutorials/GeneralAcnOnly.html) を参照してください。

WebLogic LoginModule 実装

LoginModule クラスの WebLogic 実装は、WebLogic Server 配布キットにおいて、WL_HOME\server\lib ディレクトリの weblogic.jar ファイルで提供されています。

注意 : WebLogic Server は、JAAS で定義されているすべてのコールバックのタイプだけではなく、JAAS 仕様を拡張するコールバックのタイプもすべてサポートしています。

WebLogic Server 製品に付属する UsernamePasswordLoginModule は、実行に先立ってシステム ユーザの認証定義が存在するかどうかを調べ、すでに定義されている場合は何も行いません。

JASS LoginModule の実装方法の詳細については、『Java Authentication and Authorization Service Developer's Guide』を参照してください。

JVM 全体のデフォルトユーザと runAs() メソッド

WebLogic Server の LoginModule 実装 (weblogic.security.auth.login.UsernamePasswordLoginModule) を初めて使用してログインすると、指定されたユーザが JVM (Java 仮想マシン) に対するマシン全体のデフォルト ユーザとなります。weblogic.security.Security.runAs() メソッドを実行すると、このメソッドは指定された Subject と現在のスレッドのアクセス パーミッションを関連付けてから、アクションを実行します。指定された Subject が特権を持たないユーザ (グループに割り当てられていないユーザは特権を持たないと見なされる) を表している場合、JVM 全体のデフォルト ユーザが使用されます。したがって、runAs() メソッドでは必要な Subject を指定することが重要です。それには、以下のオプションがあります。

コード リスト 3-1runAs() メソッドのラッパー コード

import java.security.PrivilegedAction;
import javax.security.auth.Subject;
import weblogic.security.Security;

public class client
{
public static void main(String[] args)
{
Security.runAs(new Subject(),
new PrivilegedAction() {
public Object run() {
//
//クライアント コードに実装する場合、main() はここに記述する
//
return null;
}
});
}
}

 


JAAS 認証を使用するクライアント アプリケーションの作成

WebLogic Server Java クライアントにおいて JAAS を使ってサブジェクトを認証するには、以下の手順を実行します。

  1. WebLogic Server で使用する認証メカニズム用の LoginModule クラスを実装します。認証メカニズムのタイプごとに LoginModule クラスが必要です。1 つの WebLogic Server デプロイメントに対して複数の LoginModule クラスを割り当てることができます。LoginModule クラスの実装方法については、「http://java.sun.com/security/jaas/doc/api.html」にある『Java Authentication and Authorization Service (JAAS) 1.0 Developer's Guide』を参照してください。
  2. 注意 : ユーザ名およびパスワードの認証には、WebLogic Server 提供の LoginModule の実装 (weblogic.security.auth.login.UsernamePasswordLoginModule) を使用することをお勧めします。必要であれば、ユーザ名およびパスワードの認証用に自分で LoginModule を作成することもできます。しかし、WebLogic Server の LoginModule を修正して再利用しようとはしないでください。LoginModule を自分で作成する場合は、ログインを実行するために weblogic.security.auth.Authenticate.authenticate() メソッドを呼び出すように記述します。SAML などリモートのログイン システムを使用している場合は、authenticate() メソッドを呼び出す必要はありません。WebLogic Server を使用してログインを実行する場合は、authenticate() を呼び出すだけで済みます。

    weblogic.security.auth.Authenticate クラスは、表 3-3 で説明されているように初期コンテキストとして「JNDI Environment object」を使用します。

  3. LoginModule がユーザと対話し、ユーザ名、パスワード、URL などの要求された情報を取得するために使用する CallbackHandler クラスを実装します。URL には WebLogic クラスタの URL も指定でき、その場合クライアント側でサーバのフェイルオーバによるメリットを得られます。WebLogic Server 配布キットで提供される JAAS クライアントのサンプルで使用される、サンプルの CallbackHandler については、コード リスト 3-2 を参照してください。
  4. 注意 : 独自の CallbackHandler クラスを実装する代わりに、2 つの WebLogic 提供による CallbackHandler クラス、すなわち weblogic.security.SimpleCallbackHandler または weblogic.security.URLCallbackHandler のいずれかを使用できます。これらのクラスの詳細については、「WebLogic クラスの Javadoc」を参照してください。

コード リスト 3-2CallbackHandler インタフェースの実装

package examples.security.jaas;

import java.io.*;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.callback.TextOutputCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.TextInputCallback;
import javax.security.auth.callback.NameCallback;
import weblogic.security.auth.callback.URLCallback;
import examples.utils.common.ExampleUtils;
/**
* SampleCallbackHandler.java
* CallbackHandler インタフェースの実装
*
* @author Copyright (c) 2000-2002 by BEA Systems, Inc. All Rights
* Reserved.
*/
class SampleCallbackHandler implements CallbackHandler
{
private String username = null;
private String password = null;
private String url = null;
  public SampleCallbackHandler() { }
  public SampleCallbackHandler(String pUsername, String pPassword,
String pUrl)
{
username = pUsername;
password = pPassword;
url = pUrl;
}
  public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException
{
for(int i = 0; i < callbacks.length; i++)
{
if(callbacks[i] instanceof TextOutputCallback)
{
// 指定したタイプに従ってメッセージを表示
TextOutputCallback toc = (TextOutputCallback)callbacks[i];
switch(toc.getMessageType())
{
case TextOutputCallback.INFORMATION:
ExampleUtils.log(toc.getMessage());
break;
case TextOutputCallback.ERROR:
ExampleUtils.log("ERROR: " + toc.getMessage());
break;
case TextOutputCallback.WARNING:
ExampleUtils.log("WARNING: " + toc.getMessage());
break;
default:
throw new IOException("Unsupported message type: " +
toc.getMessageType());
}
}
else if(callbacks[i] instanceof NameCallback)
{
        // コマンドラインでユーザ名が未入力の場合は、
        // ユーザにユーザ名の入力を促す
NameCallback nc = (NameCallback)callbacks[i];
if (ExampleUtils.isEmpty(username)) {
System.err.print(nc.getPrompt());
System.err.flush();
nc.setName((new BufferedReader(new
InputStreamReader(System.in))).readLine());
}
else {
ExampleUtils.log("username: "+username);
nc.setName(username);
}
}
else if(callbacks[i] instanceof URLCallback)
{
// コマンドラインで URL が未入力の場合は、ユーザに URL の
        // 入力を促す
// このサンプルでは URL が必要
URLCallback uc = (URLCallback)callbacks[i];
if (ExampleUtils.isEmpty(url)) {
System.err.print(uc.getPrompt());\
System.err.flush();
uc.setURL((new BufferedReader(new
InputStreamReader(System.in))).readLine());\
}
else {
ExampleUtils.log("URL: "+url);
uc.setURL(url);
}
}
else if(callbacks[i] instanceof PasswordCallback)
{
PasswordCallback pc = (PasswordCallback)callbacks[i];
        // コマンドラインでパスワードが未入力の場合は、
        // ユーザにパスワードの入力を促す
        if (ExampleUtils.isEmpty(password)) {
System.err.print(pc.getPrompt());
System.err.flush();
          // 注意 : JAAS の仕様では、パスワードは String ではなく
          // char[] である
String tmpPassword = (new BufferedReader(new
InputStreamReader(System.in))).readLine();
int passLen = tmpPassword.length();
char[] passwordArray = new char[passLen];
for(int passIdx = 0; passIdx < passLen; passIdx++)
passwordArray[passIdx] = tmpPassword.charAt(passIdx);
pc.setPassword(passwordArray);
}
else {
String tPass = new String();
for(int p = 0; p < password.length(); p++)
tPass += "*";
ExampleUtils.log("password: "+tPass);
pc.setPassword(password.toCharArray());
}
}
else if(callbacks[i] instanceof TextInputCallback)
{
// ユーザ名の入力を要求する
TextInputCallback callback =
(TextInputCallback)callbacks[i];
System.err.print(callback.getPrompt());
System.err.flush();
callback.setText((new BufferedReader(new
InputStreamReader(System.in))).readLine());
}
else
{
throw new UnsupportedCallbackException(callbacks[i],
"Unrecognized Callback");
}
}
}
}
  1. WebLogic Server で使用する LoginModule クラス、および LoginModule クラスを呼び出す順序を指定するコンフィグレーション ファイルを記述します。WebLogic Server 配布キットで提供される JAAS クライアントのサンプルで使用される、サンプルの コンフィグレーション ファイル については、コード リスト 3-3 を参照してください。

コード リスト 3-3sample_jaas.config のコード例

/** JAAS サンプル アプリケーション用のログイン コンフィグレーション **/
Sample {
weblogic.security.auth.login.UsernamePasswordLoginModule
required debug=false;
};
  1. Java クライアントにおいて、LoginContext をインスタンス化するコードを記述します。LoginContext は、コンフィグレーション ファイル sample_jaas.config を調べて、WebLogic Server 用にコンフィグレーションされているデフォルトの LoginModule をロードします。LoginContext のインスタンス化の例については、コード リスト 3-4 を参照してください。

コード リスト 3-4LoginContext のコードの一部分

...
import javax.security.auth.login.LoginContext;
...
    LoginContext loginContext = null;
    try
{
// LoginContext を作成する。ユーザ名/パスワード ログイン モジュールを指定する
loginContext = new LoginContext("Sample",
new SampleCallbackHandler(username, password, url));
}

注意 : ID アサーション プロバイダや WebLogic Server のリモート インスタンスなどの他の手段を使ってユーザを認証する場合には、デフォルト LoginModule はリモート リソースによって決定されます。

  1. LoginContextlogin() メソッドを呼び出します。login() メソッドによって、ロードされた LoginModule がすべて呼び出されます。各 LoginModule でサブジェクトの認証が試みられます。コンフィグレーションされているログイン条件が満たされない場合、LoginContextLoginException を送出します。login() メソッドの例については、コード リスト 3-5 を参照してください。

コード リスト 3-5login() メソッドのコードの一部分

...
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import javax.security.auth.login.FailedLoginException;
import javax.security.auth.login.AccountExpiredException;
import javax.security.auth.login.CredentialExpiredException;
...
/**
     * 認証を試みる
     */
try
{
// 例外が発生せずに復帰した場合は、認証に成功
loginContext.login();
    }
    catch(FailedLoginException fle)
    {
System.out.println("Authentication Failed, " +
fle.getMessage());
System.exit(-1);
}
catch(AccountExpiredException aee)
{
System.out.println("Authentication Failed: Account Expired");
System.exit(-1);
}
catch(CredentialExpiredException cee)
{
System.out.println("Authentication Failed: Credentials
Expired");
System.exit(-1);
}
catch(Exception e)
{
System.out.println("Authentication Failed: Unexpected
Exception, " + e.getMessage());
e.printStackTrace();
System.exit(-1);
}
  1. Java クライアント内にコードを記述して、javax.security.auth.Subject.getSubject() メソッドを使用する LoginContext インスタンスから認証されたサブジェクトを取得し、アクションをサブジェクトとして呼び出します。サブジェクトの認証に成功したら、weblogic.security.Security.runAs() メソッドを呼び出すことで、そのサブジェクトに対してアクセス制御を設定できます。runAs() メソッドは、指定されたサブジェクトと現在のスレッドのアクセス パーミッションを関連付けた後、アクションを実行します。getSubject() メソッドと runAs() メソッドの実装例については、コード リスト 3-6 を参照してください。
  2. 注意 : WebLogic Server アプリケーションで JAAS javax.security.auth.Subject.doAs メソッドを使用する場合、サブジェクトとクライアント アクションは関連付けられません。doAs メソッドを使用して WebLogic Server アプリケーションに J2SE セキュリティを実装することは可能ですが、この場合でも Security.runAs() メソッドを使用する必要があります。

コード リスト 3-6getSubject メソッドと runAs メソッドのコードの一部分

...
/**
* 認証されたサブジェクトを取得し、サブジェクトとして SampleAction を実行する
*/
Subject subject = loginContext.getSubject();
SampleAction sampleAction = new SampleAction(url);
Security.runAs(subject, sampleAction);
System.exit(0);
...
  1. サブジェクトが必要な特権を持っている場合にアクションを実行するコードを記述します。株式取引用の EJB を実行する javax.security.PrivilegedAction クラスのサンプル実装については、コード リスト 3-7 を参照してください。

コード リスト 3-7PrivilegedAction の実装例

package examples.security.jaas;

import java.security.PrivilegedAction;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.FinderException;
import javax.ejb.ObjectNotFoundException;
import javax.ejb.RemoveException;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import examples.ejb20.basic.statelessSession.TraderHome;
import examples.ejb20.basic.statelessSession.Trader;
import examples.utils.common.ExampleUtils;
/**
* SampleAction.java
*
* JAAS サンプル PrivilegedAction の実装
*
* @author Copyright (c) 2000-2002 by BEA Systems, Inc. All Rights
* Reserved.
*/
public class SampleAction implements PrivilegedAction
{
private static final String JNDI_NAME =
"ejb20-statelessSession-TraderHome";
private String url;

public SampleAction(String url)
{
this.url = url;
}
  public Object run()
{
Object obj = null;
    try {
callTraderEJB();
}
catch(Exception e) {
e.printStackTrace();
}
return obj;
}
  /**
* Trader EJB を呼び出す
*/
public void callTraderEJB()
throws NamingException, CreateException, RemoteException,
RemoveException
{
TraderHome home = lookupTraderHome();
    // Trader を作成する
ExampleUtils.log("Creating a trader");
Trader trader = (Trader)ExampleUtils.narrow(home.create(),
Trader.class);
    String [] stocks = {"BEAS", "MSFT", "AMZN", "HWP" };
      // 購入を実行する
for (int i=0; i<stocks.length; i++) {
int shares = (i+1) * 100;
ExampleUtils.log("Buying "+shares+" shares of
"+stocks[i]+".");
trader.buy(stocks[i], shares);
}
    // 売却を実行する
for (int i=0; i<stocks.length; i++) {
int shares = (i+1) * 100;
ExampleUtils.log("Selling "+shares+" shares of
"+stocks[i]+".");
trader.sell(stocks[i], shares);
}
    // Trader を削除する
ExampleUtils.log("Removing the trader");
trader.remove();
}
  /**
* JNDI を使って Bean のホーム インタフェースをルックアップする
   */
private TraderHome lookupTraderHome()
throws NamingException
{
Context ctx = ExampleUtils.getInitialContext(url);
Object home = (TraderHome)ctx.lookup(JNDI_NAME);
return (TraderHome)ExampleUtils.narrow(home, TraderHome.class);
}
}
  1. LoginContext インスタンスの logout() メソッドを呼び出します。logout() メソッドは、ユーザのセッションをクローズし、Subject をクリアします。login() メソッドの例については、コード リスト 3-8 を参照してください。

コード リスト 3-8logout() メソッドのコード例

...
import javax.security.auth.login.LoginContext;
...
try
{
System.out.println("logging out...");
loginContext.logout();
}

注意 : LoginModule.logout() メソッドは WebLogic 認証プロバイダまたはカスタム認証プロバイダに対して呼び出されることはありません。これは単に、いったん Principals が作成され Subject 内に入れられると、WebLogic Security フレームワークはこの Subject のライフサイクルを制御しなくなるからです。したがって、JAAS LoginContext を作成してログインおよび Subject の取得を行う、開発者によって記述されたユーザ コードでは、ログアウトするためにも LoginContext を呼び出す必要があります。LoginContext.logout() を呼び出すと、Subject から Principals がクリアされます。

 


JNDI 認証の使い方

Java クライアントは、Java Naming and Directory Interface (JNDI) を使用して WebLogic Server に資格を渡します。Java クライアントは、JNDI InitialContext を取得して WebLogic Server との通信を確立します。その後、InitialContext を使用して、WebLogic Server JNDI ツリーで必要なリソースをルックアップします。

注意 : JAAS は認証方法として望ましい選択肢ですが、WebLogic 認証プロバイダの LoginModule はユーザ名とパスワードの認証しかサポートしていません。したがって、クライアントの証明書認証 (双方向 SSL 認証ともいう) では JNDI を使用します。クライアントの証明書認証に JAAS を使用するには、LoginModule で証明書の認証を行うカスタム認証プロバイダを記述する必要があります。LoginModule の記述方法については、http://java.sun.com/j2se/1.4.1/docs/guide/security/jaas/JAASLMDevGuide.html を参照してください。

ユーザとユーザの資格を指定するには、表 3-3 で示されている JNDI プロパティを設定します。

表 3-3 認証に使用される JNDI プロパティ 

プロパティ

意味

INITIAL_CONTEXT_FACTORY

エントリ ポイントを WebLogic Server 環境に提供する。クラス weblogic.jndi.WLInitialContextFactory は WebLogic Server 用の JNDI SPI。

PROVIDER_URL

ネーム サービスを提供する WebLogic Server のホストとポートを指定する。例 : t3://weblogic:7001

SECURITY_PRINCIPAL

ユーザがデフォルトの (アクティブな) セキュリティ レルムに対して認証されているときのユーザの ID を指定する。

SECURITY_CREDENTIALS

ユーザがデフォルトの (アクティブな) セキュリティ レルムに対して認証されているときのユーザの資格を指定する。


 

これらのプロパティは、InitialContext コンストラクタに渡されるハッシュ テーブルに格納されます。コード リスト 3-9 に、WebLogic Server で実行される Java クライアントでの JNDI 認証の使い方を示します。.

コード リスト 3-9認証の例

...
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL, "t3://weblogic:7001");
env.put(Context.SECURITY_PRINCIPAL, "javaclient");
env.put(Context.SECURITY_CREDENTIALS, "javaclientpassword");
ctx = new InitialContext(env);

注意 : JNDI コンテキストとスレッドの詳細と、JNDI コンテキストの潜在的な問題を回避する方法については、『WebLogic JNDI プログラマーズ ガイド』の「JNDI コンテキストとスレッド」および「JNDI コンテキストの問題の回避方法」を参照してください。

 


Java クライアントの JAAS 認証コード例

WebLogic Server ソフトウェアには、完全な実践的 JAAS 認証サンプルが付属しています。そのサンプルは、SAMPLES_HOME\server\examples\src\examples\security\jaas ディレクトリにあります。このサンプルの説明と、構築、コンフィグレーション、および実行の手順については、サンプル ディレクトリの package.html ファイルを参照してください。このコード例は、修正して再利用できます。

 

フッタのナビゲーションのスキップ  ページの先頭 前 次