LoginModule
の実装ステップ
当初、Java認証・承認サービス(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
により更新されます。 LoginModule
は、loginメソッドの説明で述べるように、CallbackHandler
を使用してユーザーと通信します(ユーザー名とパスワードの入力を求めるためなど)。 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
パッケージに関する知識が必要です。 このパッケージには、使用できる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
への変更は、すべてが認識します。
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、Linux、Mac OS X、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
が成功した場合)に呼び出されます。
このメソッドは、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認証フェーズです。 これは、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、LinuxまたはMac OS X用、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
自体を呼び出す必要はありません。 これを呼び出すと、意図せずにセキュリティ・ホールを作り出してしまう可能性があります。 たとえば、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ファイルおよびドキュメントをクライアントから使用できるようにします。