public class LdapLoginModule extends Object implements 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
%
」) とそれに続く 2 つの 16 進数という標準のメカニズムを使用してエスケープする必要があります (URI
を参照)。クエリーの各コンポーネントも URL から省略する必要があります。
DNS による LDAP サーバーの自動検出 (RFC 2782) は、DNS がそのようなサービスをサポートするように構成済みの場合にはサポートされます。これは、LDAP URL からホスト名およびポート番号コンポーネントを省略することで使用可能になります。
このモジュールは、次のオプションの Configuration
オプションも認識します。
userFilter=ldap_filter
ldap_filter
は LDAP フィルタ文字列です (RFC 2254)。特殊なトークン「{USERNAME}
」が含まれている場合、そのトークンは、フィルタがディレクトリの検索に使用される前に、指定されたユーザー名の値と置き換えられます。 authIdentity=auth_id
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 つのアクセス権が必要です。
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"; };
コンストラクタと説明 |
---|
LdapLoginModule() |
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
で指定されたオプション。public boolean login() throws LoginException
ユーザーの資格を取得し、指定された LDAP ディレクトリでそれらを検証します。
login
、インタフェース: LoginModule
LoginModule
を無視してはならないため、常に true。FailedLoginException
- 認証に失敗した場合。LoginException
- この LoginModule
で認証が実行できない場合。public boolean commit() throws LoginException
LoginContext の認証全体が成功した場合 (関連する REQUIRED、REQUISITE、SUFFICIENT、および OPTIONAL の各 LoginModule が成功した場合) に呼び出されます。
この LoginModule 自体の認証が成功 (login
メソッドによって保存された、非公開状態を取得することでチェックされる) した場合は、LdapPrincipal
と 1 つ以上の UserPrincipal
が LoginModule
内の Subject
と関連付けられます。この LoginModule 自体の認証が失敗した場合は、当初保存された状態を削除します。
commit
、インタフェース: LoginModule
LoginException
- コミットに失敗した場合public boolean abort() throws LoginException
このメソッドは、全体の認証に失敗した場合に呼び出されます。(関連する REQUIRED、REQUISITE、SUFFICIENT、および OPTIONAL の各 LoginModule が失敗した場合)。
この LoginModule 自体の認証が成功した場合は (login
メソッドと commit
メソッドによって保存された非公開状態を取得して調べる)、当初保存された状態を整理します。
abort
、インタフェース: LoginModule
LoginException
- 中止に失敗した場合。public boolean logout() throws LoginException
commit
メソッドで追加された主体を削除します。
logout
、インタフェース: LoginModule
LoginModule
を無視してはならないため、常に true。LoginException
- ログアウトに失敗した場合。
Copyright © 1998, 2013, Oracle and/or its affiliates. All rights reserved.