LoginContext
クラスは、Subjectを認証するための基本的なメソッドを記述し、基本となる認証テクノロジに依存しないアプリケーション開発の方法を提供します。 Configuration
は、特定のアプリケーションで使用される認証テクノロジ(LoginModule
)を指定します。 このため、アプリケーション自体に変更を加えることなく、アプリケーションに異なるLoginModuleをプラグインできます。
このクラスは、プラグイン可能な認証をサポートするだけでなく、認証のスタックという概念もサポートします。 アプリケーションを、2つ以上のLoginModuleを使用するように構成できます。 たとえば、1つのアプリケーションでKerberos LoginModuleとスマート・カードLoginModuleの両方を構成できます。
呼出し側は通常、nameとCallbackHandler
を指定してLoginContextをインスタンス化します。 LoginContextは、nameをConfigurationのインデックスとして使用し、使用するLoginModuleや、認証全体を成功させるために成功させなければならないLoginModuleを判定します。 CallbackHandler
はベースとなるLoginModuleに渡され、LoginModuleはユーザーとのやりとり(グラフィカル・ユーザー・インタフェースでユーザー名とパスワードの入力を求めるなど)を行います。
呼出し側がLoginContextをインスタンス化すると、login
メソッドを呼び出してSubject
の認証を行います。 login
メソッドは構成済モジュールを呼び出して、それぞれのタイプの認証(ユーザー名/パスワードを使用した認証、スマート・カードのPIN認証など)を行います。 認証に失敗しても、LoginModuleは認証を再試行しません。また、遅延時間も発生しません。 こうしたタスクは、LoginContextの呼出し側が担当します。
login
メソッドが例外をスローすることなく返れば、認証は総合的に成功したことになります。 そして、呼出し側はgetSubject
メソッドを呼び出すことで、新たに認証されたSubjectを取得できます。 Subjectと関連付けられたPrincipalとCredentialは、SubjectのgetPrincipals
、getPublicCredentials
、およびgetPrivateCredentials
の各メソッドを呼び出すことで取得できます。
Subjectをログアウトさせる場合、呼出し側はlogout
メソッドを呼び出します。 login
メソッドの場合と同様、このlogout
メソッドは構成済みモジュールのlogout
メソッドを呼び出します。
1つのLoginContextで複数のSubjectを認証することはできません。 Subjectごとに別個のLoginContextを使用する必要があります。
次の内容は、すべてのLoginContextコンストラクタに適用されます。
-
Subject
- コンストラクタにSubject入力パラメータが指定されている場合、LoginContextは呼出し側で指定されたSubjectオブジェクトを使用する。
- 呼出し側が
null
Subjectを指定した場合で、null
値が許可されているとき、LoginContextは新しいSubjectをインスタンス化する。 - コンストラクタにSubject入力パラメータが指定されていない場合、LoginContextは新しいSubjectをインスタンス化する。
-
Configuration
- コンストラクタにConfiguration入力パラメータが指定されている場合で、呼出し側がnull以外のConfigurationを指定したとき、LoginContextは呼出し側で指定されたConfigurationを使用する。
コンストラクタにConfiguration入力パラメータが指定されていない場合、または呼出し側が
null
Configurationオブジェクトを指定した場合、コンストラクタは次の呼出しを使用してインストール済みのConfigurationを取得する。config = Configuration.getConfiguration();
どちらの場合も、コンストラクタに指定されたname引数はConfiguration.getAppConfigurationEntry
メソッドに渡される。 Configurationが指定されたnameのエントリを持たない場合、LoginContext
は、デフォルトのエントリ名であるotherでgetAppConfigurationEntry
を呼び出す。 otherのエントリが存在しない場合、LoginException
がスローされる。 - LoginContextがインストール済のConfigurationを使用する場合、呼出し側はcreateLoginContext.nameと、場合によってはcreateLoginContext.otherというAuthPermissionを必要とする。 さらに、LoginContextは
AccessController.doPrivileged
から構成済モジュールを呼び出す。これは、セキュリティ保護の必要があるタスク(リモート・ホストへの接続、Subjectの更新など)を実行するモジュールはそれぞれアクセス権を必要とするが、LoginContextの呼出し側はこれらのアクセス権なしで済むようにするためである。 - LoginContextが呼出し側で指定されたConfigurationを使用する場合、呼出し側はcreateLoginContext AuthPermissionを必要としない。 LoginContextは呼出し側に代わって
AccessControlContext
を保存し、そのコンテキストの制約を課されたAccessController.doPrivileged
呼出し内から構成済みモジュールを呼び出す。 つまり、呼出し側のコンテキスト(LoginContextの作成時に保存されたコンテキスト)は、モジュールが実行するセキュリティ保護を必要とするタスクの実行に必要なアクセス権を備えている必要がある。
- コンストラクタにConfiguration入力パラメータが指定されている場合で、呼出し側がnull以外のConfigurationを指定したとき、LoginContextは呼出し側で指定されたConfigurationを使用する。
-
CallbackHandler
- コンストラクタにCallbackHandler入力パラメータが指定されている場合、LoginContextは呼出し側で指定されたCallbackHandlerオブジェクトを使用する。
- コンストラクタにCallbackHandler入力パラメータが指定されていない場合や、呼出し側が
null
CallbackHandlerオブジェクトを指定し、かつnull
値が許可されている場合、LoginContextはauth.login.defaultCallbackHandler
セキュリティ・プロパティに問い合わせてデフォルトのハンドラ実装の完全指定クラス名を取得する。 このセキュリティ・プロパティが設定されていない場合、ベースとなるモジュールはユーザーとの通信に使用するCallbackHandlerを持たない。 このため、呼出し側は、構成済みモジュールが別の手段でユーザー認証を行うことができると想定する。 - 上記のように呼出し側で指定されたConfigurationを使用せず、インストール済みConfigurationを使用するLoginContextは、呼出し側で指定された(デフォルトの) CallbackHandler実装を新しいCallbackHandler実装でラップする必要がある。この新しいCallbackHandler実装の
handle
メソッド実装は、呼出し側の現在のAccessControlContext
によって制約を課されたjava.security.AccessController.doPrivileged
呼出し内で、指定されたCallbackHandlerのhandle
メソッドを呼び出す。
- 導入されたバージョン:
- 1.4
- 関連項目:
Security
,AuthPermission
,Subject
,CallbackHandler
,Configuration
,LoginModule
,セキュリティ・プロパティ
-
コンストラクタのサマリー
コンストラクタコンストラクタ説明LoginContext(String name)
名前を指定して新しいLoginContext
をインスタンス化します。LoginContext(String name, CallbackHandler callbackHandler)
名前とCallbackHandler
オブジェクトを指定して新しいLoginContext
オブジェクトをインスタンス化します。LoginContext(String name, Subject subject)
名前とSubject
オブジェクトを指定して新しいLoginContext
オブジェクトをインスタンス化します。LoginContext(String name, Subject subject, CallbackHandler callbackHandler)
名前、認証を受けるSubject
オブジェクト、およびCallbackHandler
オブジェクトを指定して、新しいLoginContext
オブジェクトをインスタンス化します。LoginContext(String name, Subject subject, CallbackHandler callbackHandler, Configuration config)
名前、認証を受けるSubject
オブジェクト、CallbackHandler
オブジェクト、およびログインConfiguration
を指定して、新しいLoginContext
オブジェクトをインスタンス化します。 -
メソッドのサマリー
-
コンストラクタの詳細
-
LoginContext
public LoginContext(String name) throws LoginException名前を指定して新しいLoginContext
をインスタンス化します。- パラメータ:
name
-Configuration
のインデックスとして使用される名前。- 例外:
LoginException
- 呼出し側で指定されたname
がConfiguration
になく、other
のConfiguration
エントリがない場合、またはauth.login.defaultCallbackHandler
セキュリティ・プロパティは設定されているが、実装クラスをロードできなかった場合。SecurityException
- SecurityManagerが構成され、呼び出し元にAuthPermission("createLoginContext.name")がない場合、またはname
の構成エントリが存在せず、呼び出し元に追加でAuthPermission("createLoginContext.other")がない場合
-
LoginContext
public LoginContext(String name, Subject subject) throws LoginException名前とSubject
オブジェクトを指定して新しいLoginContext
オブジェクトをインスタンス化します。- パラメータ:
name
-Configuration
のインデックスとして使用される名前。subject
- 認証対象のSubject
。- 例外:
LoginException
- 呼出し側で指定されたname
がConfiguration
になく、otherのConfiguration
エントリがない場合、呼出し側で指定されたsubject
がnull
の場合、またはauth.login.defaultCallbackHandlerセキュリティ・プロパティは設定されているが、実装クラスをロードできなかった場合。SecurityException
- SecurityManagerが設定されていて、呼出し側がAuthPermission("createLoginContext.name")を持たない場合、またはnameの構成エントリが存在せず、呼出し側がAuthPermission("createLoginContext.other")を持たない場合
-
LoginContext
public LoginContext(String name, CallbackHandler callbackHandler) throws LoginException名前とCallbackHandler
オブジェクトを指定して新しいLoginContext
オブジェクトをインスタンス化します。- パラメータ:
name
-Configuration
のインデックスとして使用される名前。callbackHandler
- LoginModuleがユーザーとやりとりするために使用するCallbackHandler
オブジェクト。- 例外:
LoginException
- 呼出し側で指定されたname
がConfiguration
になく、other
のConfiguration
エントリがない場合、または呼出し側で指定されたcallbackHandler
がnull
の場合。SecurityException
- SecurityManagerが設定されていて、呼出し側がAuthPermission("createLoginContext.name")を持たない場合、またはnameの構成エントリが存在せず、呼出し側がAuthPermission("createLoginContext.other")を持たない場合
-
LoginContext
public LoginContext(String name, Subject subject, CallbackHandler callbackHandler) throws LoginException名前、認証を受けるSubject
オブジェクト、およびCallbackHandler
オブジェクトを指定して、新しいLoginContext
オブジェクトをインスタンス化します。- パラメータ:
name
-Configuration
のインデックスとして使用される名前。subject
- 認証対象のSubject
。callbackHandler
- LoginModuleがユーザーとやりとりするために使用するCallbackHandler
オブジェクト。- 例外:
LoginException
- 呼出し側で指定されたname
がConfiguration
になく、otherのConfiguration
エントリがない場合、呼出し側で指定されたsubject
がnull
の場合、または呼出し側で指定されたcallbackHandler
がnull
の場合。SecurityException
- SecurityManagerが設定されていて、呼出し側がAuthPermission("createLoginContext.name")を持たない場合、またはnameの構成エントリが存在せず、呼出し側がAuthPermission("createLoginContext.other")を持たない場合
-
LoginContext
public LoginContext(String name, Subject subject, CallbackHandler callbackHandler, Configuration config) throws LoginException名前、認証を受けるSubject
オブジェクト、CallbackHandler
オブジェクト、およびログインConfiguration
を指定して、新しいLoginContext
オブジェクトをインスタンス化します。- パラメータ:
name
- 呼出し側で指定されたConfiguration
のインデックスとして使用される名前。subject
- 認証対象のSubject
、またはnull
。callbackHandler
- LoginModuleがユーザーとやりとりするために使用するCallbackHandler
オブジェクト、またはnull
。config
- 認証を行うために呼び出されるログイン・モジュールのリストであるConfiguration
、またはnull
。- 例外:
LoginException
- 呼出し側で指定されたname
がConfiguration
に存在せず、otherのConfiguration
エントリがない場合。SecurityException
- SecurityManagerが設定されており、configがnull
で、呼出し側がAuthPermission("createLoginContext.name")を持たない場合、またはnameの構成エントリが存在せず、呼出し側がAuthPermission("createLoginContext.other")を追加で持たない場合。- 導入されたバージョン:
- 1.5
-
-
メソッドの詳細
-
login
public void login() throws LoginException認証を実行します。このメソッドは、ログイン
Configuration
の定義に従い、LoginContext
コンストラクタに指定されたnameに合わせて設定された各LoginModuleに対してlogin
メソッドを呼び出します。 各LoginModule
は次に、それぞれのタイプの認証(ユーザー名/パスワードの認証、スマート・カードのPIN認証など)を実行します。このメソッドでは、認証全体が成功した場合(関連するREQUIRED、REQUISITE、SUFFICIENT、OPTIONALのLoginModuleが成功)に構成済みのLoginModuleの
commit
メソッドを呼び出すか、認証全体が失敗した場合に構成済みの各LoginModuleのabort
メソッドを呼び出すことで、2フェーズの認証プロセスを完了します。 認証に成功した場合、成功した各LoginModuleのcommit
メソッドは、関連するPrincipalとCredentialをSubject
に関連付けます。 認証に失敗した場合、各LoginModuleのabort
メソッドは、以前に保存されていた状態を削除または破棄します。認証プロセスの
commit
フェーズに失敗すると認証全体が失敗し、このメソッドは構成済みの各LoginModule
に対してabort
メソッドを呼び出します。何らかの理由で
abort
フェーズが失敗した場合は、login
フェーズ中またはcommit
フェーズ中にスローされた元の例外を伝達します。 どちらの場合も、認証全体が失敗します。複数のLoginModuleで失敗した場合、最初に失敗した
LoginModule
で発生した例外を伝達します。このメソッドが
abort
フェーズに入った場合(login
フェーズまたはcommit
フェーズが失敗)、このメソッドはアプリケーション用に構成されたすべてのLoginModuleを、それぞれのConfiguration
フラグ・パラメータとは関係なく呼び出します。 すなわち、abort
フェーズ中は、Requisite
とSufficient
のセマンティックスは無視されます。 これにより、適切なクリーンアップと状態の復元を行うことが保証されます。- 例外:
LoginException
- 認証に失敗した場合。
-
logout
public void logout() throws LoginExceptionSubject
をログアウトします。このメソッドは、この
LoginContext
用に構成された各LoginModule
のlogout
メソッドを呼び出します。 各LoginModule
は、それぞれのログアウト処理を行います。これには、Subject
からのPrincipal
およびCredential
情報の削除/破棄や、状態のクリーンアップなどが含まれます。このメソッドは、アプリケーション用に構成されたすべてのLoginModuleを、それぞれの
Configuration
フラグ・パラメータに関係なく呼び出します。 すなわち、このメソッドでは、Requisite
とSufficient
のセマンティックスは無視されます。 これにより、適切なクリーンアップと状態の復元を行うことが保証されます。- 例外:
LoginException
- ログアウトに失敗した場合。
-
getSubject
public Subject getSubject()認証されたSubjectを返します。- 戻り値:
- 認証済みSubject。 呼出し側がこのLoginContextのコンストラクタにSubjectを指定した場合、このメソッドは呼出し側で指定されたSubjectを返す。 Subjectが指定されておらず、認証が成功した場合、このメソッドは、インスタンス化され、このLoginContextによる認証に使用されるSubjectを返す。 Subjectが指定されておらず、認証が失敗した場合、または認証が行われなかった場合、このメソッドはnullを返す。
-