- すべての実装されたインタフェース:
LoginModule
LoginModule
は、LDAPベースの認証を実行します。 ユーザー名とパスワードは、LDAPディレクトリに格納された対応するユーザー資格について検証されます。 このモジュールでは、NameCallback
およびPasswordCallback
をサポートするために、指定されたCallbackHandler
が必要です。 認証が成功すると、ユーザーの識別名を使用して新しいLdapPrincipal
が作成され、ユーザーのユーザー名を使用して新しいUserPrincipal
が作成されて、両方とも現在のSubject
に関連付けられます。
このモジュールは、最初に検索、最初に認証、認証のみの3つのモードのいずれかで動作します。 モードは、オプションの特定のセットを指定することで選択します。
最初に検索モードでは、ユーザーの識別名を判定するためにLDAPディレクトリが検索され、次に認証が試みられます。 匿名の検索は、提供されたユーザー名と指定された検索フィルタを併用して実行されます。 成功すると、ユーザーの識別名と提供されたパスワードを使用して認証が試みられます。 このモードを有効にするには、userFilter
オプションを設定し、authIdentity
オプションを省略します。 事前にユーザーの識別名がわかっていない場合は、最初に検索モードを使用してください。
最初に認証モードでは、提供されたユーザー名とパスワードを使用して認証が試みられてから、LDAPディレクトリが検索されます。 認証が成功すると、提供されたユーザー名と指定された検索フィルタを併用して検索が実行されます。 このモードを有効にするには、authIdentity
オプションとuserFilter
オプションを設定します。 匿名検索を禁止するよう構成されているLDAPディレクトリにアクセスする場合は、最初に認証モードを使用してください。
認証のみモードでは、提供されたユーザー名とパスワードを使用して認証が試みられます。 ユーザーの識別名はあらかじめわかっているため、LDAPディレクトリは検索されません。 このモードを有効にするには、有効な識別名にauthIdentity
オプションを設定し、userFilter
オプションを省略します。 事前にユーザーの識別名がわかっている場合は、認証のみモードを使用してください。
次のオプションは必須であり、このモジュールのログインConfiguration
に指定する必要があります。
-
userProvider=ldap_urls
- このオプションは、ユーザー・エントリを格納するLDAPディレクトリを識別します。ldap_urlsは、使用するLDAPサーバーと、ユーザー・エントリがあるディレクトリ・ツリー内の位置を識別する、空白で区切られたLDAP URL (RFC 2255)のリストです。 複数のLDAP URLを指定すると、最初の正常な接続が確立されるまで、各LDAP URLが順番に試みられます。 URLの識別名コンポーネント内のスペースは、パーセント文字(「
%
」)とそれに続く2つの16進数という標準のメカニズムを使用してエスケープする必要があります(URI
を参照)。 クエリーの各コンポーネントもURLから省略する必要があります。DNSによるLDAPサーバーの自動検出(RFC 2782)は、DNSがそのようなサービスをサポートするように構成済みの場合にはサポートされます。 これは、LDAP URLからホスト名およびポート番号コンポーネントを省略することで使用可能になります。
このモジュールは、次のオプションのConfiguration
オプションも認識します。
-
userFilter=ldap_filter
- このオプションは、LDAPディレクトリ内のユーザーのエントリの検索に使用する検索フィルタを指定します。 ユーザーの識別名の決定に使用されます。
ldap_filter
はLDAPフィルタ文字列(RFC 2254)です。 特別なトークン"{USERNAME}
"が含まれている場合、フィルタを使用してディレクトリを検索する前に、そのトークンが指定のユーザー名の値に置き換えられます。 -
authIdentity=auth_id
- このオプションは、LDAPディレクトリへのユーザーの認証時に使用するアイデンティティを指定します。
auth_id
は、LDAP識別名文字列(RFC 2253)またはその他の文字列名です。 名前が認証に使用される前に、指定されたユーザー名の値で置換される特別なトークン"{USERNAME}
"が含まれている必要があります。 このオプションに識別名を含めない場合は、userFilter
オプションも指定する必要があります。 -
authzIdentity=authz_id
- このオプションは、ユーザーの認可アイデンティティを指定します。
authz_id
は任意の文字列名です。 中カッコを含む単一の特殊なトークンで構成される場合、そのトークンは属性名として扱われ、ユーザーのLDAPエントリからのその属性の単一値と置き換えられます。 属性が見つからない場合、このオプションは無視されます。 このオプションが指定され、ユーザーが正常に認証されている場合、承認識別情報を使用して追加のUserPrincipal
が作成され、現在のSubject
と関連付けられます。 -
useSSL
-
false
の場合、このモジュールは、認証を試みる前にLDAPサーバーへのSSL接続を確立しません。 SSLは、ユーザーのパスワードのプライバシを保護するために使用します。これは、LDAPではユーザーのパスワードが平文で送信されるためです。 デフォルトでは、このモジュールはSSLを使用します。 -
useFirstPass
-
true
の場合、このモジュールは、それぞれのキーにjavax.security.auth.login.nameとjavax.security.auth.login.passwordを使用してモジュールの共有状態からユーザー名とパスワードを取得します。 取得した値は認証に使用されます。 認証に失敗した場合は再試行されず、呼出し元のアプリケーションにエラーが返されます。 -
tryFirstPass
-
true
の場合、このモジュールは、それぞれのキーにjavax.security.auth.login.nameとjavax.security.auth.login.passwordを使用してモジュールの共有状態からユーザー名とパスワードを取得します。 取得した値は認証に使用されます。 認証に失敗した場合は、モジュールはCallbackHandler
を使用して新しいユーザー名とパスワードを取得し、別の認証を試みます。 この認証にも失敗した場合は、呼出し元のアプリケーションにエラーが返されます。 -
storePass
-
true
の場合、このモジュールは、CallbackHandler
から取得したユーザー名とパスワードを、それぞれのキーとして「javax.security.auth.login.name」と「javax.security.auth.login.password」を使用して、モジュールの共有状態に格納します。 既存のユーザー名とパスワードの値がすでに共有状態に存在する場合、あるいは認証に失敗した場合は、何も行われません。 -
clearPass
-
true
の場合、認証のログインとコミットの両フェーズが完了したあと、このモジュールでモジュールの共有状態に格納されたユーザー名とパスワードをクリアします。 -
debug
-
true
の場合、標準出力ストリームにデバッグ・メッセージが表示されます。
任意の"JNDIプロパティ"は、Configuration
で指定することもできます。 これらは環境に追加され、LDAPプロバイダに渡されます。 次の4つのJNDIプロパティはこのモジュールによって直接設定されます。構成内にも存在する場合は無視されます。
-
java.naming.provider.url
-
java.naming.security.principal
-
java.naming.security.credentials
-
java.naming.security.protocol
Configuration
の3つの例を次に示します。 最初の構成は、最初に検索モードをアクティブにします。 これはLDAPサーバーを識別し、ユーザーのエントリがそのuid
およびobjectClass
属性によって検索されるよう指定します。 また、ユーザーのemployeeNumber
属性に基づく識別情報を作成することを指定します。 2番目の構成は、最初に認証モードをアクティブにします。 これは、LDAPサーバーが動的に検索され、指定されたユーザー名を使用してSSLの保護なしで認証が直接実行され、ユーザーのエントリが3つのネーミング属性のいずれかとそのobjectClass
属性によって検索されることを要求します。 3番目の構成は、認証のみモードをアクティブにします。 これは、代替LDAPサーバーを識別し、承認に使用する識別名と、許可に使用する一定の識別情報を指定します。 ディレクトリ検索は行われません。
ExampleApplication { com.sun.security.auth.module.LdapLoginModule REQUIRED userProvider="ldap://ldap-svr/ou=people,dc=example,dc=com" userFilter="(&(uid={USERNAME})(objectClass=inetOrgPerson))" authzIdentity="{EMPLOYEENUMBER}" debug=true; }; ExampleApplication { com.sun.security.auth.module.LdapLoginModule REQUIRED userProvider="ldap:///cn=users,dc=example,dc=com" authIdentity="{USERNAME}" userFilter="(&(|(samAccountName={USERNAME})(userPrincipalName={USERNAME})(cn={USERNAME}))(objectClass=user))" useSSL=false debug=true; }; ExampleApplication { com.sun.security.auth.module.LdapLoginModule REQUIRED userProvider="ldap://ldap-svr1 ldap://ldap-svr2" authIdentity="cn={USERNAME},ou=people,dc=example,dc=com" authzIdentity="staff" debug=true; };
- ノート:
SecurityManager
がアクティブなときは、LoginContext
を作成しLoginModule
を使用するアプリケーションには特定のアクセス権が付与されている必要があります。アプリケーションでインストールされている
Configuration
を使用してログイン・コンテキストを作成する場合、ログイン・コンテキストを作成するには、このアプリケーションにAuthPermission
が付与されている必要があります。 たとえば、次のセキュリティ・ポリシーでは、ユーザーの現在のディレクトリ内のアプリケーションで任意のログイン・コンテキストをインスタンス生成できます。grant codebase "file:${user.dir}/" { permission javax.security.auth.AuthPermission "createLoginContext.*"; };
また、アプリケーションで呼出し側指定のConfiguration
を使用してログイン・コンテキストを作成する場合、そのアプリケーションにはLoginModule
で必要なアクセス権が付与されている必要があります。 このモジュールには次の2つのアクセス権が必要です。- LDAPサーバーに接続するための
SocketPermission
。 -
Subject
に関連付けられたPrincipal
のセットを変更するためのAuthPermission
。
たとえば、次のセキュリティ・ポリシーで、ユーザーの現在のディレクトリ内のアプリケーションに、このモジュールで必要なすべてのアクセス権が付与されます。
grant codebase "file:${user.dir}/" { permission java.net.SocketPermission "*:389", "connect"; permission java.net.SocketPermission "*:636", "connect"; permission javax.security.auth.AuthPermission "modifyPrincipals"; };
- LDAPサーバーに接続するための
- 導入されたバージョン:
- 1.6
-
コンストラクタのサマリー
-
メソッドのサマリー
-
コンストラクタの詳細
-
LdapLoginModule
public LdapLoginModule()LdapLoginModule
を作成します。
-
-
メソッドの詳細
-
initialize
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) このLoginModule
を初期化します。- 定義:
initialize
、インタフェースLoginModule
- パラメータ:
subject
- 認証対象のSubject
。callbackHandler
- ユーザー名とパスワードを取得するCallbackHandler
。sharedState
- 共有LoginModule
の状態。options
- このLoginModule
用にログインConfiguration
で指定されたオプション。
-
login
public boolean login() throws LoginExceptionユーザー認証を開始します。ユーザーの資格を取得し、指定されたLDAPディレクトリでそれらを検証します。
- 定義:
login
、インタフェースLoginModule
- 戻り値:
- この
LoginModule
を無視してはならないため、常にtrue。 - 例外:
FailedLoginException
- 認証に失敗した場合。LoginException
- このLoginModule
で認証が実行できない場合。
-
commit
public boolean commit() throws LoginExceptionユーザー認証を完了します。LoginContextの認証全体が成功した場合(関連するREQUIRED、REQUISITE、SUFFICIENT、およびOPTIONALの各LoginModuleが成功した場合)に呼び出されます。
このLoginModule自体の認証が成功(
login
メソッドによって保存された、非公開状態を取得することでチェックされる)した場合は、LdapPrincipal
と1つ以上のUserPrincipal
がLoginModule
内のSubject
と関連付けられます。 このLoginModule自体の認証が失敗した場合は、当初保存された状態を削除します。- 定義:
commit
、インタフェースLoginModule
- 戻り値:
- このLoginModule自体のログインとコミットの試みが成功した場合はtrue、そうでない場合はfalse。
- 例外:
LoginException
- コミットに失敗した場合
-
abort
public boolean abort() throws LoginExceptionユーザー認証を中止します。このメソッドは、全体の認証に失敗した場合に呼び出されます。(関連するREQUIRED、REQUISITE、SUFFICIENT、およびOPTIONALの各LoginModuleが失敗した場合)。
このLoginModule自体の認証が成功した場合は(
login
メソッドとcommit
メソッドによって保存された非公開状態を取得して調べる)、当初保存された状態を整理します。- 定義:
abort
、インタフェースLoginModule
- 戻り値:
- このLoginModule自体のログインやコミットの試みが失敗した場合はfalse、そうでない場合はtrue。
- 例外:
LoginException
- 中止に失敗した場合。
-
logout
public boolean logout() throws LoginExceptionユーザーをログアウトさせます。commit
メソッドで追加された主体を削除します。- 定義:
logout
、インタフェースLoginModule
- 戻り値:
- この
LoginModule
を無視してはならないため、常にtrue。 - 例外:
LoginException
- ログアウトに失敗した場合。
-