WebLogic Security プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
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 認証を使用する場合は、次のことに注意してください。
weblogic.security.auth.login.UsernamePasswordLoginModule
) はユーザ名とパスワードの認証しかサポートしていません。したがって、クライアントの証明書認証 (双方向 SSL 認証ともいう) では JNDI を使用します。クライアントの証明書認証に JAAS を使用するには、証明書の認証を行うカスタム LoginModule を記述する必要があります。 注意 : WebLogic Server クライアントで使用する LoginModule を自分で作成する場合は、weblogic.security.auth.Authenticate.authenticate()
を呼び出してログインを実行するように記述する必要があります。
weblogic.security.auth.Authenticate.authenticate()
メソッドを呼び出してログインを実行するように記述する必要があります。weblogic.security.auth.Authenticate.authenticate()
を呼び出す必要はありません。WebLogic Server を使用してログインを実行する場合は、authenticate()
メソッドを呼び出すだけで済みます。注意 : WebLogic Server は、JAAS 認証に対して完全なコンテナ サポートを提供し、アプリケーション コードにおける JAAS の認証と認可の完全な使用をサポートしています。
weblogic.security.services.Authentication.authenticate()
です。認証クラスを使用する場合、ヘルパー クラスとしては weblogic.security.SimpleCallbackHandler
が有用であると考えられます。JAAS の詳細については、Web 上の http://java.sun.com/security/jaas/doc/api.html にある『Java Authentication and Authorization Service Developer's Guide』を参照してください。
クライアントがアプリケーション、アプレット、エンタープライズ 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 ソフトウェア配布キットをインストールする必要があります。
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」を参照してください。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JAAS 認証クライアント アプリケーションには、少なくとも以下のコンポーネントが含まれます。
Java クライアントは LoginContext
オブジェクトをインスタンス化し、オブジェクトの login()
メソッドを呼び出すことでログインを呼び出します。login()
メソッドは LoginModule 内のメソッドを呼び出して、ログインおよび認証を実行します。
LoginContext はまた、新しい空の javax.security.auth.Subject
オブジェクト (認証されているユーザまたはサービスを表す) をインスタンス化し、コンフィグレーションされた LoginModule を作成し、それをこの新しい Subject
および CallbackHandler
で初期化します。
LoginContext は、その後 LoginContext の getSubject
メソッドを呼び出すことで、認証されたサブジェクトを取得します。LoginContext は weblogic.security.Security
クラス runAs()
メソッドを使って、ユーザ ID に代わって実行される PrivilegedAction
または PrivilegedExceptionAction
と Subject
の ID を関連付けます。
LoginModule は CallbackHandler
を利用して、ユーザ名およびパスワードを取得し、そのユーザ名とパスワードが予想どおりのものであるかどうかを確認します。
認証に成功すると、LoginModule は、ユーザを表すプリンシパルをサブジェクトに格納します。LoginModule がサブジェクトに格納するプリンシパルは Principal
のインスタンスであり、java.security.Principal
インタフェースを実装するクラスです。
LoginModule ファイルは、ユーザ名およびパスワードの認証や証明書の認証など、さまざまなタイプの認証を実行するように記述できます。クライアント アプリケーションに含める LoginMdule は、1 つ (最低要件) でも複数でもかまいません。
注意 : WebLogic Server アプリケーションで JAAS javax.security.auth.Subject.doAs
メソッドを使用する場合、サブジェクトとクライアント アクションは関連付けられません。doAs
メソッドを使用して WebLogic Server アプリケーションに J2SE セキュリティを実装することは可能ですが、この場合でも Security.runAs()
メソッドを使用する必要があります。
CallbackHandler
は、javax.security.auth.callback.CallbackHandler
インタフェースを実装します。LoginModule は、CallbackHandler
を使って、ユーザと対話し、ユーザ名やパスワードなどの要求された情報を取得します。
このファイルでは、アプリケーションで使用する LoginModule をコンフィグレーションします。LoginModule の場所と、複数の LoginModule がある場合は、実行する順番を指定します。このファイルを使うと、Java アプリケーションは LoginModule を使って定義および実装される認証テクノロジから独立を保つことができます。
ant
構築スクリプト (build.xml
)ここで説明しているコンポーネントを実装する完全な実践的 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) を参照してください。
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』を参照してください。
WebLogic Server の LoginModule 実装 (
weblogic.security.auth.login.UsernamePasswordLoginModule
) を初めて使用してログインすると、指定されたユーザが JVM (Java 仮想マシン) に対するマシン全体のデフォルト ユーザとなります。weblogic.security.Security.runAs()
メソッドを実行すると、このメソッドは指定された Subject
と現在のスレッドのアクセス パーミッションを関連付けてから、アクションを実行します。指定された Subject
が特権を持たないユーザ (グループに割り当てられていないユーザは特権を持たないと見なされる) を表している場合、JVM 全体のデフォルト ユーザが使用されます。したがって、runAs()
メソッドでは必要な Subject
を指定することが重要です。それには、以下のオプションがあります。
main()
の制御を持つ場合は、コード リスト 3-1 で示されているラッパー コードをクライアント コードで実装します。コード リスト 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;
}
});
}
}
main()
の制御を持たない場合、コード リスト 3-1 に示したラッパー コードを各スレッドの run()
メソッドに実装します。
WebLogic Server Java クライアントにおいて JAAS を使ってサブジェクトを認証するには、以下の手順を実行します。
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』を参照してください。注意 : ユーザ名およびパスワードの認証には、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」を使用します。
CallbackHandler
クラスを実装します。URL には WebLogic クラスタの URL も指定でき、その場合クライアント側でサーバのフェイルオーバによるメリットを得られます。WebLogic Server 配布キットで提供される JAAS クライアントのサンプルで使用される、サンプルの CallbackHandler
については、コード リスト 3-2 を参照してください。注意 : 独自の 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");
}
}
}
}
コード リスト 3-3sample_jaas.config のコード例
/** JAAS サンプル アプリケーション用のログイン コンフィグレーション **/
Sample {
weblogic.security.auth.login.UsernamePasswordLoginModule
required debug=false;
};
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 はリモート リソースによって決定されます。
LoginContext
の login()
メソッドを呼び出します。login()
メソッドによって、ロードされた LoginModule がすべて呼び出されます。各 LoginModule でサブジェクトの認証が試みられます。コンフィグレーションされているログイン条件が満たされない場合、LoginContext
は LoginException
を送出します。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);
}
javax.security.auth.Subject.getSubject()
メソッドを使用する LoginContext
インスタンスから認証されたサブジェクトを取得し、アクションをサブジェクトとして呼び出します。サブジェクトの認証に成功したら、weblogic.security.Security
.runAs()
メソッドを呼び出すことで、そのサブジェクトに対してアクセス制御を設定できます。runAs()
メソッドは、指定されたサブジェクトと現在のスレッドのアクセス パーミッションを関連付けた後、アクションを実行します。getSubject()
メソッドと runAs() メソッドの実装例については、コード リスト 3-6 を参照してください。
注意 : 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);
...
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);
}
}
LoginContext
インスタンスの logout()
メソッドを呼び出します。logout()
メソッドは、ユーザのセッションをクローズし、Subject
をクリアします。login()
メソッドの例については、コード リスト 3-8 を参照してください。
...
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
がクリアされます。
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 プロパティを設定します。
|
|
|
|
これらのプロパティは、InitialContext
コンストラクタに渡されるハッシュ テーブルに格納されます。コード リスト 3-9 に、WebLogic Server で実行される Java クライアントでの JNDI 認証の使い方を示します。.
...
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 コンテキストの問題の回避方法」を参照してください。
WebLogic Server ソフトウェアには、完全な実践的 JAAS 認証サンプルが付属しています。そのサンプルは、SAMPLES_HOME\server\examples\src\examples\security\jaas
ディレクトリにあります。このサンプルの説明と、構築、コンフィグレーション、および実行の手順については、サンプル ディレクトリの package.html
ファイルを参照してください。このコード例は、修正して再利用できます。
![]() ![]() |
![]() |
![]() |