モジュール jdk.security.auth

クラスLdapLoginModule

java.lang.Object
com.sun.security.auth.module.LdapLoginModule
すべての実装されたインタフェース:
LoginModule

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
このオプションは、ユーザー・エントリを格納する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つのアクセス権が必要です。

たとえば、次のセキュリティ・ポリシーで、ユーザーの現在のディレクトリ内のアプリケーションに、このモジュールで必要なすべてのアクセス権が付与されます。


     grant codebase "file:${user.dir}/" {
         permission java.net.SocketPermission "*:389", "connect";
         permission java.net.SocketPermission "*:636", "connect";
         permission javax.security.auth.AuthPermission "modifyPrincipals";
     };
     

導入されたバージョン:
1.6