LoginModule の実装手順
当初、Java 認証・承認サービス (Java Authentication and Authorization Service: JAAS) は、Java 2 SDK, Standard Edition (J2SDK), v 1.3 のオプションパッケージでした。JAAS は、J2SDK 1.4 より Java Standard Edition Development Kit に統合されています。
JAAS は、認証されたアイデンティティーにおけるサブジェクトベースの認証を提供します。このドキュメントでは、JAAS の認証面、特に LoginModule インタフェースに焦点を当てて解説します。
このドキュメントは、認証技術を実装する LoginModule を記述する必要がある、経験を積んだプログラマ向けに書かれています。
このドキュメントでは、読者がすでに次のドキュメントを読んでいることを前提としています。
JAAS API のさまざまなクラスおよびインタフェースについての説明も含まれます。詳細は、JAAS API 仕様の javadoc を参照してください。
次のチュートリアルは、JAAS 認証および承認を利用するすべてのユーザーを対象としています。
次のチュートリアルは、JAAS 認証および承認のチュートリアルと似ていますが、Kerberos LoginModule の使用方法の解説が含まれるため、使用する前に Kerberos をインストールする必要があります。
この 2 つのチュートリアルは、認証とセキュアな通信のための基盤技術として Kerberos を利用する「Java GSS-API および JAAS の一連のチュートリアル」に含まれています。
LoginModule ドキュメントでは、認証技術のプロバイダが実装する必要のあるインタフェースについて説明します。LoginModule は特定タイプの認証を提供するアプリケーションへプラグインされます。
アプリケーションは LoginContext アプリケーションプログラミングインタフェース (API) への書き込みを実行するのに対し、認証技術のプロバイダは LoginModule インタフェースを実装します。 Configuration では、特定のログインアプリケーションで使用される LoginModule を指定します。アプリケーション自体を変更せずに、複数の異なる LoginModule をアプリケーションのプラグインとして使用できます。
LoginContext は、Configuration の読み取りと特定の LoginModule のインスタンス化を行います。各 LoginModule は Subject、CallbackHandler、共有の LoginModule の状態、および LoginModule 固有のオプションを使ってインスタンス化されます。
Subject は、認証中のユーザーまたはサービスを表します。認証が成功すると、関連する Principal およびクレデンシャルを保持する LoginModule により Subject が更新されます。LoginModule は、たとえばユーザー名とパスワードを取得するために、CallbackHandler を使ってユーザーと通信します。login メソッドの解説を参照してください。CallbackHandler は null である可能性があることに注意してください。Subject の認証に CallbackHandler を必要とする LoginModule は、null の CallbackHandler で初期化されると、 LoginException をスローする場合があります。また、共有状態を使用して、複数の LoginModule 間で情報を共有することもできます (オプション)。
LoginModule 固有のオプションは、ログイン Configuration 内で、この LoginModule 用に構成されたオプションを表します。これらのオプションは LoginModule 自体によって定義され、その中での動作を制御します。たとえば、LoginModule でデバッグ/テスト機能をサポートするオプションを定義する場合を考えましょう。オプションは、debug=true などの、キーと値の構文を使用して定義されます。キーを使用して値を取得できるように、LoginModule はオプションを Map として格納します。LoginModule が定義することを選択するオプションの数に制限はありません。
呼び出し元アプリケーションは、認証プロセスを LoginContext の login メソッド呼び出しによって呼び出された単一の操作であると見なします。ただし、各 LoginModule 内部の認証プロセスは、明確な 2 つのフェーズにわかれています。最初のフェーズでは、LoginContext の login メソッドにより、Configuration 内に指定された各 LoginModule の login メソッドが呼び出されます。LoginModule の login メソッドは、実際の認証を実行してから (たとえば、パスワードの入力を促し、入力されたパスワードを検証する)、認証ステータスを非公開の状態情報として保存します。LoginModule の login メソッドは終了後に、true (成功した場合) または false (無視する場合) を返すか、LoginException をスローして障害を指定します。障害が発生した場合、LoginModule は認証を再試行したり、遅延を招いたりしてはいけません。これらのタスクの実行は、アプリケーションが担当します。アプリケーションが認証の再実行を試みると、各 LoginModule の login が再度呼び出されます。
次のフェーズでは、LoginContext の認証がすべて成功した (関連する required、requisite、sufficient、および optional LoginModule の login メソッドの呼び出しに成功した) 場合、各 LoginModule の commit メソッドが呼び出されます。LoginModule フラグ (required、requisite、sufficient、および optional) については、 javax.security.auth.login.Configuration のドキュメントと『JAAS リファレンスガイド』の「付録 B: サンプルログイン構成」を参照してください。LoginModule の commit メソッドは、非公開で保存された状態をチェックして、独自の認証が成功したかどうかを確認します。LoginContext の認証全体が成功し、LoginModule 自体の認証が成功すると、commit メソッドにより、関連する Principal (認証済みの識別情報) およびクレデンシャル (暗号化鍵などの認証データ) が Subject に関連付けられます。
LoginContext の認証全体が失敗した (関連する REQUIRED、REQUISITE、SUFFICIENT、および OPTIONAL LoginModule の login メソッドが成功しなかった) 場合、各 LoginModule の abort メソッドが呼び出されます。この場合、LoginModule は、当初保存されていた認証状態をすべて削除/破棄します。
Subject からのログアウトには、1 つのフェーズのみが含まれます。LoginContext は、LoginModule の logout メソッドを呼び出します。LoginModule の logout メソッドは、ログアウト処理を実行し、Principal やクレデンシャルを Subject から削除したり、セッション情報をロギングしたりします。
LoginModule の実装手順次は、LoginModule の実装およびテストに必要なステップです。
LoginModule 実装への命名LoginModule メソッドの実装LoginModule およびアプリケーションのコンパイルLoginModule の試用LoginModule 実装のドキュメント化LoginModule JAR ファイルおよびドキュメントの有効化以降では、新規 LoginModule の実装およびテストの手順を示します。いくつかのステップで実行する内容の例については、「JAAS リファレンスガイド」で説明されている SampleLoginModule などのファイルを参照してください。
最初に、新規 LoginModule プロバイダが実装する認証技術について理解した上で、要件を決定します。
まず、LoginModule がユーザーとの通信 (ユーザー名とパスワードの取得など) を必要とするかどうかを決定する必要があります。ユーザーとの通信が必要な場合は、CallbackHandler インタフェースと javax.security.auth.callback パッケージに関する知識が必要です。javax.security.auth.callback パッケージには、使用できる Callback 実装がいくつか含まれています。独自の Callback 実装を作成することもできます。LoginModule は、アプリケーション自体によって指定され、LoginModule の initialize メソッドに渡された CallbackHandler を呼び出します。LoginModule は、適切な Callback からなる配列を CallbackHandler に渡します。ステップ 3 の login メソッドを参照してください。
LoginModule 実装がエンドユーザーと通信しない設定にすることもできます。その場合には、LoginModule から callback パッケージにアクセスする必要はありません。
次に、ユーザーに提供する構成オプションを決定する必要があります。ユーザーは、現在の Configuration 実装に適した形式 (たとえばファイル形式) で構成情報を指定します。各オプションに対して、オプション名と戻り値を決定します。たとえば、LoginModule を構成して、特定の認証サーバーホストへの問い合わせを行う場合、オプションのキー名 (例、「auth_server」) およびこのオプションに指定可能なサーバーホスト名 (例、「server_one.example.com」や「server_two.example.com」など) を決定します。
LoginModule 実装への命名LoginModule の適切なパッケージおよびクラス名を決定します。
たとえば、IBM により開発された LoginModule には com.ibm.auth.Module と命名できます。ここで、com.ibm.auth はパッケージ名、Module は LoginModule クラス実装の名前です。
LoginModule メソッドの実装LoginModule インタフェースは、実装の必要な 5 つの abstract メソッドを指定します。
各メソッドの詳細については、次と「LoginModule API」を参照してください。
LoginModule 実装は、これらのメソッドに加え、引数をとらない public のコンストラクタを提供する必要があります。このことにより、LoginContext によるインスタンス化が適切に行われるようになります。LoginModule 実装でこの種のコンストラクタが提供されない場合、引数を取らないデフォルトコンストラクタが自動的に Object クラスから継承されます。
public void initialize (
Subject subject,
CallbackHandler handler,
Map<java.lang.String, ?> sharedState,
Map<java.lang.String, ?> options) { ... }
initialize メソッドが呼び出され、関連する認証および状態情報で LoginModule の初期化が行われます。
このメソッドは、LoginModule をインスタンス化したあと (かつほかの public メソッドを呼び出す前)、すぐに LoginContext により呼び出されます。このメソッド実装は、将来の使用に備えて指定された引数を格納します。
initialize メソッドは、指定された sharedState をチェックして、ほかの LoginModule から提供された追加の認証状態を確認します。また、指定されたオプション options もチェックして、LoginModule 動作に影響を及ぼす構成オプションを確認します。将来の使用に備えて、変数内にオプションの値を格納することもできます。
注:JAAS ログインモジュールは、PAM (use_first_pass、try_first_pass、use_mapped_pass、および try_mapped_pass) に定義されたオプションを使って、シングルサインオンを行います。詳細については、「Making Login Services Independent of Authentication Technologies」を参照してください。
次は、ログインモジュールがサポートする一般的なオプションの一覧です。ただし、これはガイドラインにすぎません。モジュールは、次のオプションのサブセットを随意サポートします。
try_first_pass - true の場合、スタック内の最初のログインモジュールが入力されたパスワードを保存し、それ以降のログインモジュールはこれを使用しようとする。認証に失敗した場合、ログインモジュールは新しいパスワードを要求し、認証を再試行する。use_first_pass - true の場合、スタック内の最初のログインモジュールが入力されたパスワードを保存し、それ以降のログインモジュールはこれを使用しようとする。ログインモジュールは、認証に失敗しても新しいパスワードを要求しない。try_mapped_pass - true の場合、スタック内の最初のログインモジュールが入力されたパスワードを保存し、それ以降のログインモジュールはこれをサービス固有のパスワードにマッピングしようとする。認証に失敗した場合、ログインモジュールは新しいパスワードを要求し、認証を再試行する。use_mapped_pass - true の場合、スタック内の最初のログインモジュールが入力されたパスワードを保存し、それ以降のログインモジュールはこれをサービス固有のパスワードにマッピングしようとする。ログインモジュールは、認証に失敗しても新しいパスワードを要求しない。moduleBanner - true の場合、ログインモジュールは、CallBackHandler の呼び出し時に最初の Callback として TextOutputCallback を提供する。この Callback には、認証を実行しているログインモジュールに関する情報が記述されている。debug - true の場合、ログインモジュールに対してデバッグ情報の出力を指示する。initialize メソッドは、認識できない状態やオプションを無視できます。ただし、この種のイベントが発生した場合、それを記録する方が望ましい場合もあります。
この LoginModule (およびその他の構成済み LoginModule) を呼び出す LoginContext はすべて、指定された Subject および sharedState への同一の参照を共有します。Subject および sharedState への変更は、すべての LoginContext により認識されます。
boolean login() throws LoginException;
login メソッドが呼び出され、Subject の認証が行われます。これが認証の第 1 フェーズです。
このメソッド実装は、実際の認証を実行します。たとえば、ユーザー名およびパスワードの入力を求めてから、パスワードデータベースに対しパスワードの検証を試みます。別のサンプル実装として、フィンガープリントリーダに指を挿入するようユーザーに指示し、入力されたフィンガープリントをフィンガープリントデータベースと照合する場合が考えられます。
LoginModule がユーザーとの通信 (ユーザー名とパスワードの取得など) を必要とする場合、この通信を直接行うことはできません。このため、ユーザーとのさまざまな通信方法が存在します。実際のところ、LoginModule がユーザーと通信する際、特定の方法に依存しないようにすることは、望ましい方法です。ユーザーと通信し、適切な結果 (ユーザー名、パスワードなど) を設定するためには、LoginModule の login メソッドから、initialize メソッドに渡された CallbackHandler の handle メソッドを呼び出すほうがよいでしょう。LoginModule は CallbackHandler に適切な Callback (ユーザー名に対しては NameCallback、パスワードに対しては PasswordCallback) からなる配列を渡し、CallbackHandler は要求に従ってユーザーと通信し、Callback 内に適切な値を設定します。たとえば、NameCallback を処理する場合、CallbackHandler はユーザーから名前を取得し、NameCallback の setName メソッドを呼び出してその名前を格納します。
認証プロセスに、ネットワーク経由の通信が含まれる場合もあります。たとえば、このメソッド実装が Kerberos の kinit と等価な機能を実行する場合、KDC とのコンタクトが必要になります。パスワードデータベースのエントリがリモートネームサービス内に存在する場合、Java Naming and Directory Interface (JNDI) を利用するなどして、そのネームサービスとコンタクトを取る必要があります。実装は、基盤となるオペレーティングシステムと通信する必要もあります。たとえば、ユーザーが Solaris や Windows NT などのオペレーティングシステムにログインしている場合、このメソッドは基盤となるオペレーティングシステムの識別情報を単にインポートします。
login メソッドは、次の処理を行う必要があります。
LoginModule を無視するかどうかを決定します。たとえば、ユーザーがこの LoginModule と無関係な識別情報を使って認証を試みた場合 (たとえば、ユーザーが NIS を使い、root で認証を試みた場合) は、LoginModule を無視する必要があります。この LoginModule を無視する必要がある場合、login の戻り値は false になります。それ以外の場合、次の処理を行います。CallbackHandler の handle メソッドを呼び出します。commit メソッドで使用される可能性があります。true を返し、認証に失敗した場合は LoginException (FailedLoginException など) をスローします。login メソッド実装が、新規 Principal またはクレデンシャル情報を保存済みの Subject オブジェクトに関連付けることはできません。このメソッドは、認証のみを実行して、認証結果および対応する認証状態を格納します。あとで、commit または abort メソッドからこの結果および状態へのアクセスが行われます。結果および状態は、ほかの LoginModule と共有ではないので、通常、sharedState Map には保存できません。
たとえば、LoginModule がパスワードを共有するように構成されている場合であれば、このメソッドにとって、sharedState の Map に状態情報を保存することは有利です。この場合、入力されたパスワードは、共有状態として保存されます。パスワードの共有により、パスワードを 1 回入力するだけで後続の LoginModule でも認証された状態を維持できます。次に、sharedState の Map から名前とパスワードを格納および保存する際の標準的な規約を示します。
javax.security.auth.login.name - 名前を保存/取得するための共有状態マップキーとして使用。javax.security.auth.login.password - パスワードを保存/取得するための共有状態マップキーとして使用。認証に失敗した場合、login メソッドは認証を再試行できません。この処理はアプリケーションが担当します。LoginModule.login() 内から何度もログインを試みるよりも、アプリケーションから繰り返し LoginContext の login メソッドを呼び出すことをお勧めします。
boolean commit() throws LoginException;
commit メソッドが呼び出され、認証プロセスがコミットされます。これは、第 1 認証フェーズが成功した場合の第 2 認証フェーズです。LoginContext 全体の認証が成功した場合 (関連する REQUIRED、REQUISITE、SUFFICIENT、および OPTIONAL の LoginModule が成功した場合)、commit メソッドが呼び出されます。
このメソッドは、login メソッドにより保存された認証結果および対応する認証状態にアクセスします。
認証結果から login メソッドの失敗が明らかになった場合、commit メソッドは最初に保存された対応する状態をすべて削除/破棄します。
保存された結果から LoginModule の login メソッドの成功が明らかになった場合は、対応する状態情報から関連する Principal およびクレデンシャルの情報が構築されます。この Principal およびクレデンシャルの情報が、initialize メソッドによって格納された Subject に追加されます。
Principal およびクレデンシャルの追加後は、不要な状態フィールドを迅速に破棄する必要があります。たとえば、認証プロセスで格納されたユーザー名やパスワードは破棄されます。
commit メソッドは、コミットの成功または失敗を示す非公開の状態を保存する必要があります。
次に、LoginModule の commit メソッドから返される結果を図示します。各ボックスは、発生する可能性がある各種の状況を表します。たとえば、上部左側のボックスは、以前の login メソッド呼び出しと commit メソッド自体の呼び出しに成功した場合に返される commit メソッドの結果を示しています。
| COMMIT: 成功 | COMMIT: 失敗 | |
|---|---|---|
| LOGIN: 成功 | TRUE を返す | 例外をスローする |
| LOGIN: 失敗 | FALSE を返す | FALSE を返す |
boolean abort() throws LoginException;
abort メソッドが呼び出され、認証プロセスが強制的に中断されます。これは、第 1 認証フェーズが失敗した場合の第 2 認証フェーズです。abort メソッドは、LoginContext の全体の認証に失敗した場合に呼び出されます。
このメソッドは、最初に、login メソッド (および場合により commit メソッド) によって保存されている LoginModule の認証結果および対応する認証状態にアクセスし、情報を消去および破棄します。たとえば、ユーザー名およびパスワードは破棄されます。
LoginModule の認証に失敗した場合、非公開の状態を消去する必要は生じません。
次に、LoginModule の abort メソッドから返される結果を図示します。最初の図は、以前の login 呼び出しが成功したことを想定しています。たとえば、上部左側のボックスは、以前の login メソッド呼び出しと commit メソッドの呼び出しに成功し、さらに abort メソッド自体の呼び出しにも成功した場合に返される abort メソッドの結果を示しています。
| ABORT: 成功 | ABORT: 失敗 | |
|---|---|---|
| COMMIT: 成功 | TRUE を返す | 例外をスローする |
| COMMIT: 失敗 | TRUE を返す | 例外をスローする |
2 番目の図は、以前の login メソッドの呼び出しに失敗した場合に返される LoginModule の abort メソッドの結果を示しています。たとえば、上部左側のボックスは、以前の login メソッド呼び出しには失敗したが、commit メソッドの呼び出しには成功し、さらに abort メソッド自体の呼び出しにも成功した場合に返される abort メソッドの結果を示しています。
| ABORT: 成功 | ABORT: 失敗 | |
|---|---|---|
| COMMIT: 成功 | FALSE を返す | FALSE を返す |
| COMMIT: 失敗 | FALSE を返す | FALSE を返す |
boolean logout() throws LoginException;
logout メソッドが呼び出され、Subject からログアウトします。
このメソッドは、Principal を削除し、commit 操作中に Subject に関連付けられたクレデンシャルを削除/破棄します。このメソッドは、Subject 内の既存の Principal やクレデンシャル、またはほかの LoginModule によって追加された Principal やクレデンシャルに対しては、一切の操作を実行できません。
Subject が読み取り専用 (Subject の isReadOnly メソッドが true を返す) の場合、このメソッドは commit 操作中に Subject に関連付けられているクレデンシャルの破棄のみを行います (クレデンシャルを削除することはできません)。Subject が読み取り専用であり、commit 操作中に Subject と関連付けられたクレデンシャルを破棄できない (このクレデンシャルが Destroyable インタフェースを実装していない) 場合、このメソッドは LoginException をスローする可能性があります。
logout メソッドは、ログアウトに成功した場合は true を返し、それ以外の場合は LoginException をスローします。
テスト用として、既存のサンプルアプリケーションを選択するか、新しいサンプルアプリケーションを作成します。アプリケーションの要件とテストに使用できるサンプルアプリケーションについては、「JAAS リファレンスガイド」を参照してください。
LoginModule およびアプリケーションのコンパイルテストに使用する新しい LoginModule およびアプリケーションをコンパイルします。
LoginModule とアプリケーションコードを JAR ファイルに配置ステップ 6c でポリシー内の JAR ファイルを参照できるように、LoginModule およびアプリケーションコードを別々の JAR ファイルに格納します。次は、JAR ファイルを作成するサンプルコマンドです。
jar cvf <JAR file name> <list of classes, separated by spaces>
このコマンドにより、指定されたクラスを含む、指定された名前の JAR ファイルが作成されます。
jar ツールの詳細については、jar (Solaris 用) (Microsoft Windows 用) を参照してください。
本来、アプリケーションはユーザーの好みの場所に格納できます。
LoginModule も、ユーザーまたはその他のクライアントの好みの場所に格納できます。完全に信頼できる LoginModule は、JRE の lib/ext (標準拡張) ディレクトリに格納できます。
lib/ext ディレクトリ内にある LoginModule とその他のディレクトリにある LoginModule を両方ともテストする必要があります。これは、LoginModule にセキュリティー関連操作の実行に必要なアクセス権を明示的に付与しなければならない場合と、そうでない場合があるためです。
JRE の lib/ext ディレクトリ内の LoginModule は、インストール済み拡張機能と見なされるので、これにアクセス権を付与する必要はありません。インストール済み拡張機能には、デフォルトのシステムポリシーファイルにより、すべてのアクセス権が付与されます。
一方、それ以外のディレクトリ内の LoginModule には、ポリシーファイル内の grant 文を使うなどしてアクセス権を付与する必要があります。
LoginModule JAR ファイルがインストール済み拡張機能と見なされない場合は、このファイルの格納場所を指定してテストします。次のステップでは、指定された場所にある JAR ファイルにアクセス権を付与します。
LoginModule とアプリケーションの JAR ファイルにアクセス権を設定LoginModule やアプリケーションが、セキュリティーチェックをトリガーするセキュリティー関連タスク (ネットワーク接続の確立、ローカルディスク上のファイルの読み取り、書き込みなど) を実行するとします。これらがインストール済み拡張機能 (ステップ 6b を参照) ではなく、セキュリティーマネージャーがインストールされている環境で実行される場合は、アクセス権を付与する必要があります。
通常、LoginModule は Principal とクレデンシャルを認証済みのサブジェクトに関連付けます。このため、LoginModule は、アクセス権として、「modifyPrincipals」、「modifyPublicCredentials」、「modifyPrivateCredentials」というターゲット名の AuthPermission を必要とします。
次のコード例 MyLM.jar には、LoginModule にアクセス権を付与する文が含まれています。この種の文は、ポリシーファイルに記述されます。この例では、MyLM.jar ファイルは /localWork ディレクトリに格納されるものとします。
grant codeBase "file:/localWork/MyLM.jar" {
permission javax.security.auth.AuthPermission "modifyPrincipals";
permission javax.security.auth.AuthPermission "modifyPublicCredentials";
permission javax.security.auth.AuthPermission "modifyPrivateCredentials";
};
注:LoginModule 呼び出しは、常に AccessController.doPrivileged 内で行われるため、doPrivileged 自体を呼び出す必要はありません。doPrivileged を呼び出すと、意図せずにセキュリティーホールを作り出してしまう可能性があります。たとえば、LoginModule が doPrivileged 呼び出しの中でアプリケーション提供の CallbackHandler を呼び出す場合、ほかの場合にはアクセス不可能なリソースへのアクセスがアプリケーションの CallbackHandler に許可されるため、セキュリティーホールが作り出されます。
JAAS はプラグイン可能な認証アーキテクチャーをサポートするため、既存のアプリケーションを変更せずに新しい LoginModule を使用できます。新しい LoginModule の使用を示すためには、ログイン Configuration を更新するだけで済みます。
Oracle のデフォルトの Configuration 実装は、com.sun.security.auth.login.ConfigFile.html で説明するように、構成ファイルから構成情報を読み取ります。
テスト用の構成ファイルを作成します。たとえば、以前取り上げた架空の IBM のアプリケーション用 LoginModule を構成する場合、次のような内容の構成ファイルを使用することになります。
AppName {
com.ibm.auth.Module REQUIRED debug=true;
};
AppName は、アプリケーションがログイン構成ファイル内のこのエントリを参照するために使用する任意の名前です。アプリケーションはこの名前を LoginContext コンストラクタの第 1 引数として指定します。
LoginModule の試用最後に、アプリケーションと LoginModule の使用をテストします。アプリケーションの実行時、使用するログイン構成ファイルを指定します。たとえば、MyApp.jar に MyApp という名前のアプリケーションが格納されていて、構成ファイルの名前が test.conf だとします。この場合、次のようにしてアプリケーションを実行し、構成ファイルを指定できます。
java -classpath MyApp.jar -Djava.security.auth.login.config=test.conf MyApp
コマンド全体は、1 行で入力してください。ここでは、読みやすくするために複数行に分けて表示してあります。
my.policy という名前のポリシーファイルを指定し、インストールされているセキュリティーマネージャーを使ってアプリケーションを実行するには、次のように入力します。
java -classpath MyApp.jar -Djava.security.manager -Djava.security.policy=my.policy -Djava.security.auth.login.config=test.conf MyApp
ここでも、コマンド全体は 1 行で入力してください。
debug オプションを付けて LoginModule を構成すると、適正に動作することを確認できます。
コードをデバッグし、必要に応じてテストを続行します。問題が発生する場合は、上記のすべての手順が完了していることを確認してください。
ユーザーによる入力と、構成ファイルに指定した LoginModule オプションを確実に変更してください。
異なったインストールオプション (LoginModule をインストール済み拡張機能にする、クラスパス内に配置する、など) および実行環境 (セキュリティーマネージャーを実行する、または実行しない) を使用するテストも実行してください。インストールオプションの詳細は、ステップ 6b を参照してください。特に、セキュリティーマネージャーがインストールされていて LoginModule とアプリケーションがインストール済み拡張機能でない場合は、LoginModule を確実に動作させるため、ステップ 6c のようにして必要なアクセス権を付与したあと、インストールおよび実行環境をテストする必要があります。
テスト中に LoginModule またはアプリケーションを変更する必要が生じた場合は、適切な変更を加え、再コンパイルし (ステップ 5)、変更されたコードを JAR ファイル内に配置し (ステップ 6a)、JAR ファイルを再インストール (ステップ 6b) します。さらに、必要に応じてアクセス権を変更または追加し (ステップ 6c)、ログイン構成ファイルを変更し (ステップ 6d)、アプリケーションを再実行します。そのあと、必要に応じて同じステップを繰り返します。
LoginModule 実装のドキュメント化次のステップでは、LoginModule のクライアント用ドキュメントを記述します。たとえば、次のようなドキュメントを記述できます。
LoginModule 実装が使用する認証プロセス。LoginModule のインストール方法。LoginModule で有効な構成オプション。各オプションには、そのオプションの制御内容、オプション名、戻り値 (または値の型) を指定。LoginModule がインストール済み拡張機能ではなく、セキュリティーマネージャーとともに実行される場合に必要なアクセス権。LoginModule を参照するサンプル Configuration ファイル。LoginModule に必要なアクセス権を付与するサンプルポリシーファイル。LoginModule JAR ファイルおよびドキュメントの有効化最後のステップでは、LoginModule JAR ファイルおよびドキュメントをクライアントから使用できるようにします。