@Exported 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() |
修飾子と型 | メソッドと説明 |
---|---|
boolean |
abort()
ユーザー認証を中止します。
|
boolean |
commit()
ユーザー認証を完了します。
|
void |
initialize(Subject subject, CallbackHandler callbackHandler, Map<String,?> sharedState, Map<String,?> options)
この
LoginModule を初期化します。 |
boolean |
login()
ユーザー認証を開始します。
|
boolean |
logout()
ユーザーをログアウトさせます。
|
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, 2018, Oracle and/or its affiliates. All rights reserved.