JAAS承認チュートリアル
このチュートリアルでは、JAAS認証チュートリアルのチュートリアルで開発したプログラムおよびポリシー・ファイルを拡張して、JAAS承認コンポーネントを示します。JAAS承認コンポーネントによって、認証された呼出し側が、その後のセキュリティ関連の操作に必要なアクセス制御権(アクセス権)を保持することが確実化されます。承認コンポーネントでは、ユーザー認証が最初に完了していることを必要とするため、JAAS認証チュートリアルのチュートリアルを先にお読みください。
このチュートリアルは、次のセクションで構成されます。
チュートリアルのコードを最初に実行してみる場合は、「承認チュートリアル・コードの実行」を先に読んでから、その他のセクションに戻り、学習を続けてください。
JAAS承認とは
JAAS承認は、セキュリティ・ポリシーを使用して実行コードに付与するアクセス権を指定する、既存のJavaセキュリティ・アーキテクチャを拡張します(デフォルトのPolicyの実装とポリシー・ファイルの構文を参照)。これは、コード中心のアーキテクチャです。つまり、コードの特性に基づいてアクセス権が付与されます。この特性には、コードが生成された場所、デジタル署名されているかどうか、署名されている場合はだれによって署名されているか、などがあります。この例は、JAAS認証チュートリアルのチュートリアルで使用されるsampleacn.policy
ファイルにあります。このファイルには、次が含まれます。
grant codebase "file:./SampleAcn.jar" {
permission javax.security.auth.AuthPermission
"createLoginContext.Sample";
};
これにより、現行ディレクトリのSampleAcn.jar
ファイル内のコードに、指定されたアクセス権が付与されます。署名者は指定されていないため、コードが署名されているかどうかは問題となりません。
JAAS承認は、既存のコード中心のアクセス制御をユーザー中心のアクセス制御で補強します。どのコードが実行されているかだけではなく、どのユーザーが実行しているかに基づいて、アクセス権を付与できます。
アプリケーションがJAAS認証を使用してユーザーまたはその他のエンティティ(サービスなど)を認証すると、結果としてサブジェクトが生成されます。サブジェクトは、認証されたユーザーを表します。サブジェクトは一連のプリンシパルで構成され、各プリンシパルはそのユーザーの識別情報を表します。たとえば、あるサブジェクトが名前のプリンシパル(「Susan Smith」)と社会保障番号のプリンシパル(「987-65-4321」)を持つことで、そのサブジェクトを他のサブジェクトと区別できます。
ポリシー内で特定のプリンシパルにアクセス権を付与できます。ユーザーの認証後、アプリケーションはサブジェクトと現在のアクセス制御コンテキストを関連付けることができます。その後、セキュリティ・チェックの対象となる操作(ローカル・ファイル・アクセスなど)のたびに、Javaランタイムにより、ポリシー内で特定のプリンシパルのみに必要なアクセス権が付与されているかどうかを自動的に確認し、そうであれば、アクセス制御コンテキストに関連付けられたサブジェクトに指定のプリンシパルが含まれている場合にかぎり、その操作が許可されます。
JAAS承認の実行手順
JAAS承認を実行する前に、次のようにします。
- ユーザーを認証する必要があります(JAAS認証チュートリアルのチュートリアルを参照)。
- セキュリティ・ポリシー内にプリンシパルベースのエントリを構成する必要があります(プリンシパルベースのポリシー・ファイル文の作成方法を参照)。
- 認証の結果生成されるサブジェクトを現在のアクセス制御コンテキストに関連付ける必要があります(サブジェクトのアクセス制御コンテキストへの関連付けを参照)。
プリンシパルベースのポリシー・ファイル文の作成方法
ポリシー・ファイルgrant
文(デフォルトのPolicyの実装とポリシー・ファイルの構文を参照)に、1つ以上のPrincipal
フィールドをオプションで含めることができるようになりました。Principal
フィールドは、指定されたPrincipal
で表される(指定されたコードを実行する)ユーザーまたはその他のエンティティが、特定のアクセス権を保持することを表します。
このため、grant
文の基本的な書式は次のようになります
grant <signer(s) field>, <codeBase URL>
<Principal field(s)> {
permission perm_class_name "target_name", "action";
....
permission perm_class_name "target_name", "action";
};
signer
、codeBase
およびPrincipal
の各フィールドはオプションであり、各フィールドの順序は重要ではありません。
Principal
フィールドは、次のようになります。
Principal Principal_class "principal_name"
つまり、Principal
という語(大文字、小文字は区別されない)に続き、完全修飾のPrincipal
クラス名およびプリンシパル名を指定します。
Principal
クラスは、java.security.Principalインタフェースを実装するクラスです。すべてのPrincipal
オブジェクトは、getName
メソッドの呼出しによって取得できる関連名を持っています。名前に使用される書式は、Principal
実装によって異なります。
このチュートリアルで使用する、基本認証メカニズムにより作成されるSubject
内に配置されるPrincipal
のタイプは、SamplePrincipal
であるため、これをgrant
文のPrincipal
の指定のPrincipal_class
部分で使用してください。SamplePrincipal
のユーザー名はnameの形式になります。このチュートリアルで使用可能なユーザー名はtestUser
のみです。したがって、grant
文で使用するprincipal_name
の指定はtestUser
です。
単一のgrant
文内に複数のPrincipal
フィールドを含めることも可能です。複数のPrincipal
フィールドを指定する場合、現在のアクセス制御コンテキストに関連付けられたSubject
にこれらのPrincipal
のすべてが含まれる場合にのみ、grant
文のアクセス権が付与されます。
複数のPrincipal
に同じアクセス権のセットを付与するには、複数のgrant
文を作成し、各文にアクセス権のリストといずれかのPrincipal
を指し示す単一のPrincipal
フィールドを含めます。
このチュートリアルのポリシー・ファイルでは、Principal
フィールドに1つのgrant
文が含まれます。
grant codebase "file:./SampleAction.jar",
Principal sample.principal.SamplePrincipal "testUser" {
permission java.util.PropertyPermission "java.home", "read";
permission java.util.PropertyPermission "user.home", "read";
permission java.io.FilePermission "foo.txt", "read";
};
これは、指定したアクセス権を、SampleAction.jar
内のコードを実行する指定されたPrincipal
に付与することを示します。(ノート: SamplePrincipal
クラスはsample.principal
パッケージ内にあります。)
サブジェクトのアクセス制御コンテキストへの関連付け
サブジェクトを作成し、現在のアクセス制御コンテキストに関連付けるには、次のようにします。
- 最初にユーザーを認証する必要があります(JAAS認証チュートリアルを参照)。
- Subjectクラスのstaticメソッド
doAs
を呼び出し、認証されたSubjectとjava.security.PrivilegedActionまたはjava.security.PrivilegedExceptionActionを渡します。(PrivilegedActionとPrivilegedExceptionActionの相違点については、JDKでのアクセス権の付録A: 特権ブロックのためのAPIを参照してください。)doAs
メソッドは、提供されたサブジェクトを現在のアクセス制御コンテキストに関連付け、アクションからrun
メソッドを呼び出します。run
メソッド実装には、指定されたサブジェクトとして実行されるすべてのコードが含まれています。このため、アクションは指定されたサブジェクトとして実行されます。このチュートリアルで実行するように、
doAs
メソッドの代わりに、SubjectクラスのdoAsPrivileged
staticメソッドを呼び出すことができます。doAsPrivileged
は、doAs
に渡されるパラメータの他に3番目のパラメータAccessControlContextを必要とします。doAsPrivileged
は、指定されたSubjectを現在のアクセス制御コンテキストに関連付けるdoAs
と異なり、Subjectを、指定されたアクセス制御コンテキストまたは、このチュートリアルの場合のように、渡されたパラメータがnull
の場合は空のアクセス制御コンテキストに関連付けます。これらのメソッドの相違点については、『JAASリファレンス・ガイド』の「doAsとdoAsPrivileged」を参照してください。
承認チュートリアル・コード
このチュートリアルのコードは、4つのファイルで構成されます。
SampleAzn.java
は、Subject.doAsPrivileged
の呼出しに必要なコードが追加されている点以外は、JAAS認証チュートリアルチュートリアルのSampleAcn.java
アプリケーション・ファイルとまったく同じです。SampleAction.java
には、SampleAction
クラスが含まれます。このクラスは、PrivilegedActionを実装し、プリンシパルベースの認証チェックで実行するすべてのコードを含むrun
メソッドを持っています。SampleLoginModule.java
は、チュートリアルのログイン構成ファイル(JAAS承認チュートリアルのログイン構成ファイルを参照)によって、基盤となる適切な認証を実装するクラスとして指定されるクラスです。SampleLoginModule
のユーザー認証は、ユーザーによって指定された名前とパスワードが特定の値を持っていることを単に検証する処理です。このクラスについてはチュートリアルJAAS認証チュートリアルで取り上げているので、ここでは詳しい説明を省略します。SamplePrincipal.java
は、java.security.Principalインタフェースを実装するサンプル・クラスです。SampleLoginModule
によって使用されます。このクラスについては「JAAS認証」チュートリアルで取り上げているので、ここでは詳しい説明を省略します。
SampleLoginModule.java
ファイルとSamplePrincipal.java
ファイルについてはJAAS認証チュートリアルのチュートリアルで取り上げているので、ここでは詳しい説明を省略します。次の項では、その他のソース・ファイルについて説明します
SampleAzn.java
SampleAcn
と同様に、SampleAzn
クラスはLoginContext lc
をインスタンス化し、login
メソッドを呼び出して認証を実行します。認証に成功した場合は、LoginContextのgetSubject
メソッドを呼び出すことにより、認証されたサブジェクト(ユーザーを表すSamplePrincipalを含む)を取得します。
Subject mySubject = lc.getSubject();
main
メソッドは、サブジェクトに関する情報(たとえばそのサブジェクトのプリンシパル情報)をユーザーに提供した後、Subject.doAsPrivileged
を呼び出し、次に示すように、認証されたサブジェクトmySubject
、PrivilegedAction (SampleAction
)およびnull
AccessControlContextを渡します。
SampleAction
クラスは、次の方法でインスタンス化されます。
PrivilegedAction action = new SampleAction();
Subject.doAsPrivileged
の呼出しは、次の方法で行われます。
Subject.doAsPrivileged(mySubject, action, null);
doAsPrivileged
メソッドは、PrivilegedAction action
(SampleAction
)のrun
メソッドを呼び出して、サブジェクトmySubject
のかわりの実行と見なされる残りのコードの実行を開始します。
3番目のAccessControlContext引数としてdoAsPrivileged
にnull
を渡すことにより、mySubject
が新しい空のAccessControlContextに関連付けられることを示します。その結果、SampleAction
の実行時のセキュリティ・チェックでは、mySubject
として実行されるSampleAction
コード自体(またはこのコードによって呼び出されるその他のコード)のアクセス権のみが必要になります。doAsPrivileged
の呼出し側(およびdoAsPrivileged
が呼び出された時点で実行スタック上に存在していた呼出し側)は、アクションが実行されている間、アクセス権を必要としません。
SampleAzn.java
package sample;
import java.io.*;
import java.util.*;
import java.security.Principal;
import java.security.PrivilegedAction;
import javax.security.auth.*;
import javax.security.auth.callback.*;
import javax.security.auth.login.*;
import javax.security.auth.spi.*;
import com.sun.security.auth.*;
/**
* This Sample application attempts to authenticate a user
* and executes a SampleAction as that user.
*
* If the user successfully authenticates itself,
* the username and number of Credentials is displayed.
*/
public class SampleAzn {
/**
* Attempt to authenticate the user.
*
* @param args input arguments for this application. These are ignored.
*/
public static void main(String[] args) {
// Obtain a LoginContext, needed for authentication. Tell it
// to use the LoginModule implementation specified by the
// entry named "Sample" in the JAAS login configuration
// file and to also use the specified CallbackHandler.
LoginContext lc = null;
try {
lc = new LoginContext("Sample", new MyCallbackHandler());
} catch (LoginException le) {
System.err.println("Cannot create LoginContext. "
+ le.getMessage());
System.exit(-1);
} catch (SecurityException se) {
System.err.println("Cannot create LoginContext. "
+ se.getMessage());
System.exit(-1);
}
// the user has 3 attempts to authenticate successfully
int i;
for (i = 0; i < 3; i++) {
try {
// attempt authentication
lc.login();
// if we return with no exception, authentication succeeded
break;
} catch (LoginException le) {
System.err.println("Authentication failed:");
System.err.println(" " + le.getMessage());
try {
Thread.currentThread().sleep(3000);
} catch (Exception e) {
// ignore
}
}
}
// did they fail three times?
if (i == 3) {
System.out.println("Sorry");
System.exit(-1);
}
System.out.println("Authentication succeeded!");
Subject mySubject = lc.getSubject();
// let's see what Principals we have
Iterator principalIterator = mySubject.getPrincipals().iterator();
System.out.println("Authenticated user has the following Principals:");
while (principalIterator.hasNext()) {
Principal p = (Principal)principalIterator.next();
System.out.println("\t" + p.toString());
}
System.out.println("User has " +
mySubject.getPublicCredentials().size() +
" Public Credential(s)");
// now try to execute the SampleAction as the authenticated Subject
PrivilegedAction action = new SampleAction();
Subject.doAsPrivileged(mySubject, action, null);
System.exit(0);
}
}
/**
* A CallbackHandler implemented by the application.
*
* This application is text-based. Therefore it displays information
* to the user using the OutputStreams System.out and System.err,
* and gathers input from the user using the InputStream System.in.
*/
class MyCallbackHandler implements CallbackHandler {
/**
* Invoke an array of Callbacks.
*
* @param callbacks an array of <code>Callback</code> objects which contain
* the information requested by an underlying security
* service to be retrieved or displayed.
*
* @exception java.io.IOException if an input or output error occurs. <p>
*
* @exception UnsupportedCallbackException if the implementation of this
* method does not support one or more of the Callbacks
* specified in the <code>callbacks</code> parameter.
*/
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof TextOutputCallback) {
// display the message according to the specified type
TextOutputCallback toc = (TextOutputCallback)callbacks[i];
switch (toc.getMessageType()) {
case TextOutputCallback.INFORMATION:
System.out.println(toc.getMessage());
break;
case TextOutputCallback.ERROR:
System.out.println("ERROR: " + toc.getMessage());
break;
case TextOutputCallback.WARNING:
System.out.println("WARNING: " + toc.getMessage());
break;
default:
throw new IOException("Unsupported message type: " +
toc.getMessageType());
}
} else if (callbacks[i] instanceof NameCallback) {
// prompt the user for a username
NameCallback nc = (NameCallback)callbacks[i];
System.err.print(nc.getPrompt());
System.err.flush();
nc.setName((new BufferedReader
(new InputStreamReader(System.in))).readLine());
} else if (callbacks[i] instanceof PasswordCallback) {
// prompt the user for sensitive information
PasswordCallback pc = (PasswordCallback)callbacks[i];
System.err.print(pc.getPrompt());
System.err.flush();
pc.setPassword(System.console().readPassword());
} else {
throw new UnsupportedCallbackException
(callbacks[i], "Unrecognized Callback");
}
}
}
}
SampleAction.java
SampleAction.java
には、SampleAction
クラスが含まれます。このクラスは、java.security.PrivilegedAction
を実装し、サブジェクトmySubject
として実行するすべてのコードを含むrun
メソッドを持ちます。このチュートリアルでは、3つの操作を実行します。それぞれ、コードに必要なアクセス権を付与しないかぎり、実行できません。次を実行します。
java.home
システム・プロパティの値を読み取り、出力する。user.home
システム・プロパティの値を読み取り、出力する。- 現行のディレクトリに
foo.txt
という名前のファイルが存在するかどうかを確認する。
次に、コードを示します。
SampleAction.java
package sample;
import java.io.File;
import java.security.PrivilegedAction;
/**
* This is a Sample PrivilegedAction implementation, designed to be
* used with the Sample application.
*
*/
public class SampleAction implements PrivilegedAction {
/**
* This Sample PrivilegedAction performs the following operations:
* <ul>
* <li>Access the System property, <i>java.home</i></li>
* <li>Access the System property, <i>user.home</i></li>
* <li>Access the file, <i>foo.txt</i></li>
* </ul>
*
* @return <code>null</code> in all cases.
*
* @exception SecurityException if the caller does not have permission
* to perform the operations listed previously.
*/
public Object run() {
System.out.println("\nYour java.home property: "
+System.getProperty("java.home"));
System.out.println("\nYour user.home property: "
+System.getProperty("user.home"));
File f = new File("foo.txt");
System.out.print("\nfoo.txt does ");
if (!f.exists())
System.out.print("not ");
System.out.println("exist in the current working directory.");
return null;
}
}
JAAS承認チュートリアルのログイン構成ファイル
このチュートリアルで使用するログイン構成ファイルを、JAAS認証チュートリアルのチュートリアルで使用するものとまったく同じにできます。このため、1つのエントリのみを含むsample_jaas.config
ファイルを使用できます。
Sample {
sample.module.SampleLoginModule required debug=true;
};
このエントリの名前はSample
で、チュートリアル・アプリケーションSampleAcn
およびSampleAzn
がこのエントリを参照するために使用する名前です。このエントリは、ユーザー認証の実行に使用するLoginModuleがsample.module
パッケージ内のSampleLoginModule
であること、および認証が成功したと見なされるためにはこのSampleLoginModule
が「成功する」必要があることを示します。SampleLoginModule
は、ユーザーから提供された名前とパスワードが期待したもの(それぞれtestUser
とtestPassword
)である場合にかぎり成功します。
SampleLoginModuleはdebug
オプションも定義します(true
に設定可能)。このオプションの値をtrue
に設定すると、SampleLoginModuleにより、認証の進捗に関する追加情報が出力されます。
ポリシー・ファイル
この承認チュートリアルのアプリケーションは、SampleAzn
とSampleAction
の2つのクラスで構成されます。各クラスのコードにはセキュリティ関連操作が含まれるため、操作を実行するには、ポリシー・ファイル内に関連するアクセス権を指定する必要があります。
このチュートリアルで使用するLoginModule (SampleLoginModule
)にも、アクセス権を必要とする操作が含まれています。
次の項では、これらの各クラスに必要なアクセス権について説明し、その後に完全なポリシー・ファイルを記載します。
SampleAznに必要なアクセス権
SampleAzn
クラスのmainメソッドは、アクセス権の必要な2つの操作を実行します。次を実行します
- LoginContextの作成。
- Subjectクラスの
doAsPrivileged
staticメソッドの呼出し。
LoginContextの作成方法は認証チュートリアルの場合とまったく同じとなるため、createLoginContext.Sample
をターゲットとする同じjavax.security.auth.AuthPermission
アクセス権が必要です。
SubjectクラスのdoAsPrivileged
メソッドを呼び出すには、doAsPrivileged
をターゲットとするjavax.security.auth.AuthPermission
が必要です。
SampleAzn
クラスが、SampleAzn.jar
という名前のJARファイルに配置されている場合を考えましょう。ポリシー・ファイル内の次のgrant
文を使用して、これらのアクセス権をSampleAzn
コードに付与できます。
grant codebase "file:./SampleAzn.jar" {
permission javax.security.auth.AuthPermission
"createLoginContext.Sample";
permission javax.security.auth.AuthPermission "doAsPrivileged";
};
SampleActionに必要なアクセス権
SampleAction
コードは、アクセス権の必要な3つの操作を実行します。次を実行します
java.home
システム・プロパティの値の読取り。user.home
システム・プロパティの値の読取り。- 現行のディレクトリに
foo.txt
という名前のファイルが存在するかどうかの確認。
これらの操作には、次のアクセス権が必要です。
permission java.util.PropertyPermission "java.home", "read";
permission java.util.PropertyPermission "user.home", "read";
permission java.io.FilePermission "foo.txt", "read";
これらのアクセス権をSampleAction.class
のコードに付与する必要があります。これは、SampleAction.jar
という名前のJARファイル内に配置されます。ただし、この特定のgrant
文の場合、アクセス権をコードだけではなく、コードを実行する特定のユーザーにも付与することにより、アクセスを特定のユーザーに限定する方法を示します。
このため、「プリンシパルベースのポリシー・ファイル文の作成方法」で説明したように、grant
文は次のようになります。
grant codebase "file:./SampleAction.jar", Principal sample.principal.SamplePrincipal "testUser" {
permission java.util.PropertyPermission "java.home", "read";
permission java.util.PropertyPermission "user.home", "read";
permission java.io.FilePermission "foo.txt", "read";
};
SampleLoginModuleに必要なアクセス権
SampleLoginModule
コードは、アクセス権の必要な操作を1つ実行します。Subject
にPrincipal
を追加するには、modifyPrincipals
をターゲットとするjavax.security.auth.AuthPermission
が必要です。grant文は次のようになります。
grant codebase "file:./SampleLM.jar" {
permission javax.security.auth.AuthPermission "modifyPrincipals";
};
完全なポリシー・ファイル
完全なポリシー・ファイルは、sampleazn.policy
です。
sampleazn.policy
/* grant the sample LoginModule permissions */
grant codebase "file:./SampleAction.jar", Principal sample.principal.SamplePrincipal "testUser" {
permission java.util.PropertyPermission "java.home", "read";
permission java.util.PropertyPermission "user.home", "read";
permission java.io.FilePermission "foo.txt", "read";
};
grant codebase "file:./SampleLM.jar" {
permission javax.security.auth.AuthPermission "modifyPrincipals";
};
grant codebase "file:./SampleAcn.jar" {
permission javax.security.auth.AuthPermission "createLoginContext.Sample";
};
承認チュートリアル・コードの実行
JAAS承認チュートリアル・コードを実行するには、次の操作を行う必要があります。
-
次のファイルを1つのディレクトリ内に格納します。
sample_jaas.config
ログイン構成ファイル(JAAS承認チュートリアルのログイン構成ファイルを参照)sampleazn.policy
ポリシー・ファイル
-
最上位ディレクトリの下に
sample
という名前のサブディレクトリを作成し、ここに次のファイルを格納します(ノート:SampleAzn
およびSampleAction
クラスはsample
パッケージ内にある)。SampleAzn.java
ソース・ファイルSampleAction.java
ソース・ファイル
-
sample
ディレクトリのサブディレクトリを作成し、module
という名前を付けます。ここに次のものを格納します(ノート:SampleLoginModule
クラスはsample.module
パッケージ内にある)。SampleLoginModule.java
ソース・ファイル
-
sample
ディレクトリのサブディレクトリをもう1つ作成し、principal
という名前を付けます。ここに次のものを格納します(ノート:SamplePrincipal
クラスはsample.principal
パッケージ内にある)。SamplePrincipal.java
ソース・ファイル
-
最上位のディレクトリですべてのソース・ファイルをコンパイルします。
javac sample/SampleAction.java sample/SampleAzn.java sample/module/SampleLoginModule.java sample/principal/SamplePrincipal.java
コマンド全体を1行に入力してください。
-
SampleAzn.class
およびMyCallbackHandler.class
を含むJARファイルSampleAzn.jar
を作成します(ノート: これらのクラスのソース・ファイルはSampleAzn.java
内にある)。jar -cvf SampleAzn.jar sample/SampleAzn.class sample/MyCallbackHandler.class
コマンド全体を1行に入力してください。
-
SampleAction.class
を含むSampleAction.jar
という名前のJARファイルを作成します。jar -cvf SampleAction.jar sample/SampleAction.class
-
SampleLoginModule.class
とSamplePrincipal.class
を含むJARファイルを作成します。jar -cvf SampleLM.jar sample/module/SampleLoginModule.class sample/principal/SamplePrincipal.class
-
次を指定して、
SampleAzn
アプリケーションを実行します- 適切な
-classpath
節(SampleAzn.jar
、SampleAction.jar
、およびSampleLM.jar
JARファイル内のクラスを検索するため)。 -Djava.security.manager
。セキュリティ・マネージャのインストールを指定します。警告:
セキュリティ・マネージャおよびそれに関連するAPIは非推奨であり、今後のリリースでは削除されます。セキュリティ・マネージャの代わりとなるものはありません。詳細および代替手段については、JEP 411を参照してください。-Djava.security.policy==sampleazn.policy
。使用するポリシー・ファイルとしてsampleazn.policy
を指定します。-Djava.security.auth.login.config==sample_jaas.config
。使用するログイン構成ファイルとしてsample_jaas.config
を指定します。
ノート:
組込みのJDKポリシー・ファイルは、JDKの構成がすぐに使用できるセキュアなものであるよう設計されたデフォルトの権限セットを付与しますが、
java.security.policy
プロパティで等号を2つ(==
)使用すると、このファイルがオーバーライドされるため、使用する際は注意が必要です。このポリシーをオーバーライドすると予期しない動作が発生する(JDKコードに正しい権限が付与されない)可能性があるため、経験豊富なユーザーのみが実行するようにしてください。java.security.auth.login.config
システム・プロパティで、(等号を2つ(==
)ではなく)等号を1つ(=
)使用している場合、このシステム・プロパティおよびjava.security
ファイルの両方で指定された構成が使用されます。次に、Windows、LinuxおよびmacOSで使用する完全なコマンドを示します。クラス・パス項目の区切りとして、LinuxおよびmacOSシステムではコロンを使用するのに対し、Windowsではセミコロンを使用する点のみが異なります。
次にWindowsの全コマンドを示します。
java -classpath SampleAzn.jar;SampleAction.jar;SampleLM.jar -Djava.security.manager -Djava.security.policy==sampleazn.policy -Djava.security.auth.login.config==sample_jaas.config sample.SampleAzn
次に、LinuxおよびmacOSの全コマンドを示します。
java -classpath SampleAzn.jar:SampleAction.jar:SampleLM.jar -Djava.security.manager -Djava.security.policy==sampleazn.policy -Djava.security.auth.login.config==sample_jaas.config sample.SampleAzn
コマンド全体を1行で入力してください。ここでは、読みやすくするために複数行に分けて表示してあります。システムに対しコマンドが長すぎる場合は、
.bat
ファイル(Windowsの場合)または.sh
ファイル(LinuxおよびmacOSの場合)に記述し、そのファイルを実行して、コマンドを実行する必要がある場合があります。ユーザー名とパスワードの入力が求められ(
testUser
とtestPassword
を使用)、ログイン構成ファイルに指定されたSampleLoginModule
により、名前とパスワードがチェックされます。ログインが成功するとAuthentication succeeded!
というメッセージが表示され、失敗するとAuthentication failed:
の後に失敗の理由が続くメッセージが表示されます。認証が正常に完了すると、プログラム(
SampleAction
内)の他の部分がユーザーに代わって実行されます。このため、ユーザーは適切なアクセス権をあらかじめ保持している必要があります。ポリシー・ファイルsampleazn.policy
により、必要なアクセス権が付与されているため、java.home
およびuser.home
システム・プロパティの値、およびfoo.txt
という名前のファイルが現在のディレクトリに存在するかどうかに関する文が表示されます。 - 適切な