モジュール 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
  • コンストラクタのサマリー

    コンストラクタ
    コンストラクタ
    説明
    LdapLoginModuleを作成します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    boolean
    ユーザー認証を中止します。
    boolean
    ユーザー認証を完了します。
    void
    initialize(Subject subject, CallbackHandler callbackHandler, Map<String,?> sharedState, Map<String,?> options)
    このLoginModuleを初期化します。
    boolean
    ユーザー認証を開始します。
    boolean
    ユーザーをログアウトさせます。

    クラスjava.lang.Objectで宣言されたメソッド

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • コンストラクタの詳細

    • 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つ以上のUserPrincipalLoginModule内の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 - ログアウトに失敗した場合。