モジュール 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 - ログアウトに失敗した場合。