11.3.4. 発行先認証
サブジェクト認証には JAAS ログインが必要です。JAAS ログイン設定ファイルの説明は、Java ドキュメントの JAAS Login Configuration File を参照してください。
ログインプロセスは、以下のポイントで構成されます。
- アプリケーションは
LoginContextをインスタンス化し、ログイン設定の名前およびCallbackHandlerを渡して、設定LoginModules の要件に応じてCallbackオブジェクトを設定します。 LoginContextは、名前付きログイン設定に含まれるすべての LoginModuleをロードするよう設定を参照します。このような名前付き設定が存在しない場合は、他の設定がデフォルトとして使用されます。- アプリケーションは
LoginContext.loginメソッドを呼び出します。 - ログインメソッドは、ロードされた各
LoginModuleを呼び出します。各LoginModuleがサブジェクトの認証を試みると、関連付けられたCallbackHandlerで handle メソッドを呼び出し、認証プロセスに必要な情報を取得します。必要な情報は、callbackオブジェクトの配列で handle メソッドに渡されます。成功すると、LoginModuleは関連するプリンシパルとクレデンシャルをサブジェクトに関連付けます。 LoginContextは認証ステータスをアプリケーションに返します。成功はログインメソッドからの戻り値によって表されます。失敗は、ログインメソッドによってスローされる LoginException によって表されます。- 認証に成功すると、アプリケーションは
LoginContext.getSubjectメソッドを使用して認証されたサブジェクトを取得します。 - サブジェクト認証のスコープが完了したら、
LoginContext.logoutメソッドを呼び出して、ログインメソッドによってサブジェクトに関連付けられたすべてのプリンシパルおよび関連情報を削除できます。
LoginContext クラスは、サブジェクトを認証する基本的なメソッドを提供し、基礎となる認証技術に依存しないアプリケーションを開発する方法を提供します。LoginContext は Configuration を確認し、特定のアプリケーションに設定された認証サービスを判別します。LoginModule クラスは認証サービスを表します。そのため、アプリケーション自体を変更せずに、異なるログインモジュールをアプリケーションにプラグインできます。以下のコードは、アプリケーションがサブジェクトを認証するために必要な手順を示しています。
開発者は
LoginModule インターフェースの実装を作成して、認証テクノロジーと統合します。これにより、管理者は異なる認証技術をアプリケーションにプラグインできます。複数の LoginModuleをチェーンして、複数の認証テクノロジーが認証プロセスに参加できるようにすることができます。たとえば、LoginModule はユーザー名/パスワードベースの認証を実行できますが、別の LoginModule はスマートカードリーダーや biometric オーセンティケーターなどのハードウェアデバイスと対話できます。
LoginModule のライフサイクルは、クライアントがログインメソッドを作成し、発行する LoginContext オブジェクトによって実行されます。このプロセスは 2 つのフェーズで構成されます。プロセスのステップは以下のとおりです。
LoginContextは、パブリック no-arg コンストラクターを使用して設定済みのLoginModuleを作成します。- 各
LoginModuleは、初期化メソッドへの呼び出しで初期化されます。Subject引数は、常に null 以外であることが保証されます。initialize メソッドの署名は次のとおりです。public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) loginメソッドは、認証プロセスを開始するために呼び出されます。たとえば、メソッドの実装では、ユーザーにユーザー名とパスワードの入力を求めるプロンプトを出し、NIS や LDAP などの命名サービスに保存されているデータに対して情報を確認することができます。別の実装では、スマートカードとバiometric デバイスへのインターフェースを設定したり、基礎となるオペレーティングシステムからユーザー情報を抽出することもできます。各LoginModuleによるユーザーアイデンティティーの検証は JAAS 認証のフェーズ 1 とみなされます。loginメソッドの署名はboolean login() throws LoginExceptionです。LoginExceptionは失敗を示します。戻り値 true はメソッドが成功したことを示しますが、戻り値が false の場合は、ログインモジュールが無視されることを示します。LoginContextの 's overall authentication に成功すると、コミットは各LoginModuleで呼び出されます。LoginModuleについてフェーズ 1 に成功すると、コミットメソッドはフェーズ 2 を続行し、関連するプリンシパル、パブリッククレデンシャル、またはプライベートクレデンシャルをサブジェクトに関連付けます。LoginModuleでフェーズ 1 が失敗すると、コミットするとユーザー名やパスワードなどの以前に保存された認証状態が削除されます。commitメソッドの署名はboolean commit() throws LoginExceptionです。コミットフェーズの完了に失敗した場合は、LoginExceptionを発生させます。true を返すと、メソッドが成功したことを示しますが、false を返すと、ログインモジュールは無視されることを示します。LoginContext's overall authentication fails を選択すると、各LoginModuleでabortメソッドが呼び出されます。abortメソッドは、ログインまたは初期化メソッドによって作成された認証状態を削除または破棄します。アボートメソッドの署名はboolean abort() throws LoginExceptionです。中止フェーズの完了に失敗した場合は、LoginExceptionを発生させます。true を返すと、メソッドが成功したことを示しますが、false を返すと、ログインモジュールは無視されることを示します。- ログインに成功した後に認証状態を削除するには、アプリケーションが
LoginContextでlogoutを呼び出します。これにより、各LoginModuleでlogoutメソッドが呼び出されます。logoutメソッドは、コミット操作時に最初にサブジェクトに関連付けられたプリンシパルおよび認証情報を削除します。認証情報は削除時に破棄される必要があります。logoutメソッドの署名はboolean logout() throws LoginExceptionです。ログアウトプロセスの完了に失敗したため、LoginExceptionが発生します。true を返すと、メソッドが成功したことを示しますが、false を返すと、ログインモジュールは無視されることを示します。
LoginModule がユーザーと通信して認証情報を取得する必要がある場合は、callbackHandler オブジェクトを 使用 します。アプリケーションが実装する CallbackHandler インターフェースを作成してそれを LoginContext に渡します。これにより、認証情報が基礎となるログインモジュールに直接送信されます。
ログインモジュールは
CallbackHandler を使用して、パスワードやスマートカード PIN などのユーザーからの入力を収集し、ステータス情報などのユーザーに情報を提供します。アプリケーションが CallbackHandler を指定できるようにすることで、アプリケーションがユーザーと対話する方法から、基礎となる LoginModuleは独立しています。たとえば、CallbackHandler 's implementation for a GUI application の場合、ユーザー入力を要求するウィンドウが表示されることがあります。一方、アプリケーションサーバーなど、GUI 以外の環境の CallbackHandler 実装は、アプリケーションサーバー API を使用して認証情報情報を取得するだけです。その CallbackHandler インターフェースには、以下を実装する 1 つのメソッドがあります。
void handle(Callback[] callbacks)
throws java.io.IOException,
UnsupportedCallbackException;
void handle(Callback[] callbacks)
throws java.io.IOException,
UnsupportedCallbackException;
Callback インターフェースは、最後に確認される認証クラスです。これは、前述の例で使用した NameCallback や PasswordCallback を含む、複数のデフォルト実装を提供するタグ付けインターフェースです。LoginModule は Callback を使用して、認証メカニズムで必要な情報を要求します。LoginModuleは、認証のログインフェーズ中に コールバックの配列を CallbackHandler.handle メソッドに直接渡します。callbackhandler が handle メソッドに渡される Callback オブジェクトの使用方法を理解していない場合は、UnsupportedCallbackException をスローし、ログイン呼び出しを中止します。