JAAS

com.sun.security.auth.module
クラス LdapLoginModule

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

public class LdapLoginModule
extends Object
implements LoginModule

この LoginModule は、LDAP ベースの認証を実行します。ユーザー名とパスワードは、LDAP ディレクトリに格納された対応するユーザー資格について検証されます。このモジュールは、NameCallbackPasswordCallback をサポートするために、指定された 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 プロパティーはこのモジュールによって直接設定されます。構成内にも存在する場合は無視されます。

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 abort()
          ユーザー認証を中止します。
 boolean commit()
          ユーザー認証を完了します。
 void initialize(Subject subject, CallbackHandler callbackHandler, Map<String,?> sharedState, Map<String,?> options)
          この LoginModule を初期化します。
 boolean login()
          ユーザー認証を開始します。
 boolean logout()
          ユーザーをログアウトさせます。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

LdapLoginModule

public LdapLoginModule()
メソッドの詳細

initialize

public void initialize(Subject subject,
                       CallbackHandler callbackHandler,
                       Map<String,?> sharedState,
                       Map<String,?> options)
この LoginModule を初期化します。

定義:
インタフェース LoginModule 内の initialize
パラメータ:
subject - 認証を受ける Subject
callbackHandler - ユーザー名とパスワードを取得する CallbackHandler
sharedState - 共有 LoginModule の状態
options - この LoginModule 用にログイン Configuration で指定されたオプション

login

public boolean login()
              throws LoginException
ユーザー認証を開始します。

ユーザーの資格を取得し、指定された LDAP ディレクトリでそれらを検証します。

定義:
インタフェース LoginModule 内の login
戻り値:
この LoginModule を無視してはならないため、常に true
例外:
FailedLoginException - 認証に失敗した場合
LoginException - この LoginModule で認証が実行できない場合

commit

public boolean commit()
               throws LoginException
ユーザー認証を完了します。

LoginContext の認証全体が成功した場合 (関連する REQUIRED、REQUISITE、SUFFICIENT、および OPTIONAL の各 LoginModule が成功した場合) に呼び出されます。

この LoginModule 自体の認証が成功 (login メソッドによって保存された、非公開状態を取得することでチェックされる) した場合、このメソッドは LdapPrincipal および 1 つ以上の UserPrincipalLoginModule 内の Subject に関連付けます。この LoginModule 自体の認証が失敗した場合は、当初保存された状態を削除します。

定義:
インタフェース LoginModule 内の commit
戻り値:
この LoginModule 自体のログインとコミットの試みが成功した場合は true、そうでない場合は false
例外:
LoginException - コミットに失敗した場合

abort

public boolean abort()
              throws LoginException
ユーザー認証を中止します。

認証全体が失敗した場合 (関連する REQUIRED、REQUISITE、SUFFICIENT、および OPTIONAL の各 LoginModule が失敗した場合) に呼び出されます。

この LoginModule 自体の認証が成功した場合は (login メソッドと commit メソッドによって保存された非公開状態を取得して調べる)、当初保存された状態を整理します。

定義:
インタフェース LoginModule 内の abort
戻り値:
この LoginModule 自体のログインやコミットの試みが失敗した場合は false、そうでない場合は true
例外:
LoginException - 中止に失敗した場合

logout

public boolean logout()
               throws LoginException
ユーザーをログアウトさせます。

commit メソッドで追加された主体を削除します。

定義:
インタフェース LoginModule 内の logout
戻り値:
この LoginModule を無視してはならないため、常に true
例外:
LoginException - ログアウトに失敗した場合

JAAS