このドキュメントで説明するすべての機能を、LDAPサービス・プロバイダがサポートしなければならないわけではありません。ただし、ある機能をサポートする場合、そのサポート方法はこのドキュメントに説明された方法に従う必要があります。
LDAPサービス・プロバイダに影響を及ぼす環境プロパティには4つのタイプがあります。
特に、次のプロパティのいずれかが環境プロパティ内で提供されていない場合、システム・プロパティ、アプレット・パラメータ、およびプロバイダとアプリケーションのリソース・ファイルの両方から、次に示す順序で検索されます。
コンテキストの環境プロパティは、Context.getEnvironmentメソッドを使用して検査できます。
コンテキストの環境プロパティからあるプロパティを削除する場合、コンテキストはそのプロパティにはデフォルトの動作が割り当てられているものとみなします。ただし、プロパティの値としてデフォルト値を指定しなければならないという意味ではありません。削除は、コンテキストの環境プロパティにそのプロパティが存在しないことによっても示されます。
このプロパティの値は、サーバーから返される検索結果のバッチ・サイズを指定する10進数の文字列です。
このプロパティは、Context.list、Context.listBindings、DirContext.searchの各メソッドと、これらのメソッドが返すNamingEnumerationオブジェクトのブロック動作に影響を与えます。これは、返される列挙内の項目数には影響しません。LDAPプロトコル・レベルで項目のバッチ処理または読取りが行われる方法にのみ影響を与えます。
値をゼロに設定すると、それは、すべての結果が受け取られるまでプロバイダがブロックすることを意味します。0より大きい整数nを設定することは、サーバーからn個の結果が受信されるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法でプロバイダがブロックすべきであることを示します。アプリケーションが(NamingEnumeration.nextまたはNamingEnumeration.nextElementを使用して) n個の結果を読み取ったあと、プロバイダは、サーバーからさらにn個の結果が受信されるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法で読み取るべきです。
このプロパティが設定されない場合、デフォルト値は実装固有の値になります。
たとえば、次のコードは、サーバーから24個のエントリが読み取られるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法でプロバイダがブロックすべきであることを指定します。
env.put(Context.BATCHSIZE, "24");
このプロパティの値は、コントロール・ファクトリ・クラスの完全修飾されたクラス名をコロンで区切ったリストです。
ファクトリは、応答コントロールを行うクラスのナロー変換を行います。これらのファクトリは、プロバイダが生成する一般的な応答コントロールから固有の応答コントロールを作成します。
このプロパティのデフォルト値は定義されていません。
たとえば、次のコードは、ResponseControlFactoryクラスを試行対象のコントロール・ファクトリとして設定します。
env.put(LdapContext.CONTROL_FACTORIES, "com.sun.jndi.ldap.ctl.ResponseControlFactory");
このプロパティの値は、LDAPサービス・プロバイダの初期コンテキストを作成するファクトリ・クラスの完全修飾されたクラス名です。
これは、特定のLDAPサービス・プロバイダを選択するために使用します。プロバイダ自身が使用することはありません。初期コンテキスト・メソッドへの名前引数がURLである場合には、このプロパティを設定する必要はありません。
このプロパティのデフォルト値は定義されていません。
たとえば、次のコードは、SunのLDAPプロバイダを選択します。
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
このプロパティの値は、オブジェクト・ファクトリ・クラスの完全修飾されたクラス名をコロンで区切ったリストです。
ファクトリは、プロバイダから返されたLDAPエントリから特定のオブジェクトを作成します。たとえば、Personオブジェクト・ファクトリが、オブジェクト・クラスpersonのLDAPエントリからPersonオブジェクトを生成するとします。オブジェクト・ファクトリは、LDAP属性からオブジェクトを生成するという点で、状態ファクトリとは反対の動作を行います。
このプロパティのデフォルト値は定義されていません。
次に例を示します。
env.put(Context.OBJECT_FACTORIES, "com.sun.jndi.ldap.obj.PersonFromLDAP");これは、PersonFromLDAPクラスを試行対象のオブジェクト・ファクトリとして設定します。
このプロパティの値は、状態ファクトリ・クラスの完全修飾されたクラス名をコロンで区切ったリストです。
このファクトリは、オブジェクト自体からオブジェクトの状態(格納用)を作成します。たとえば、Person状態ファクトリが、Personオブジェクトからオブジェクト・クラスpersonのLDAPエントリを生成するとします。状態ファクトリは、オブジェクトからLDAP属性を生成するという点で、オブジェクト・ファクトリとは反対の動作を行います。
このプロパティのデフォルト値は定義されていません。
次に例を示します。
env.put(Context.STATE_FACTORIES, "com.sun.jndi.ldap.obj.PersonToLDAP");
これは、PersonToLDAPクラスを試行対象の状態ファクトリとして設定します。
このプロパティの値は、RFC 1766に従った文字列言語タグです。
env.put(Context.LANGUAGE, "ja-JP");
このプロパティの値は、LDAPサーバーのホスト名とポート番号、および使用するネーミング・コンテキストのルート識別名を指定するスペース区切りのLDAPまたはLDAPS URL文字列のリストです。LDAP URLはプレーン(すなわち保護されていない)接続の使用を指定し、LDAPS URLはSSL接続の使用を指定します。このリストに複数のURLが含まれる場合、プロバイダは正常に接続を作成できるまで各URLを順番に使用し、作成後はプロパティを成功したURLに設定します。
デフォルトのホスト名はlocalhostです。デフォルトのポートは、プレーン接続では389、SSL接続では636です。デフォルトのルート識別名は、空文字列です。このプロパティが設定されていない場合、またはホスト名かポート番号のいずれかが省略されている場合、未指定の情報の代わりにデフォルト値が使用されます。URLにホスト名とポートのどちらも存在しないが、空でない識別名が含まれている場合、プロバイダは「URL」セクションの説明に従って、その識別名を使用してLDAPサーバーのホスト名とポートを決定し、接続が正常に確立された場合は、接続に成功したホスト名、ポート、および識別名を使用して、構築されたURLにjava.naming.provider.urlプロパティを設定します。また、プロバイダがURLにあるその他の情報をどのように扱うべきかについても、「URL」セクションを参照してください。
たとえば、
env.put(Context.PROVIDER_URL, "ldap://secserver:636");これは、LDAPサーバーがsecserverという名前のホストのポート636で動作していることを示します。
注: Context.addToEnvironmentまたはContext.removeFromEnvironmentメソッドを使用してこのプロパティを変更しても、コンテキストには影響を与えません。このプロパティを使用するのは、初期コンテキスト・コンストラクタだけです。
このプロパティの値は、プロバイダが照会を処理する方法を指定する文字列です。次の値は、このプロパティ用に定義されたものです。
1つの照会エントリで検出された複数のURLを処理する方法については、「URL」を参照してください。
このプロパティが設定されていない場合、そのデフォルト値はignoreです。
たとえば、
env.put(Context.REFERRAL, "throw");
このプロパティの値は、使用するプロバイダ用の認証メカニズムを指定する文字列です。次の値は、このプロパティ用に定義されたものです。
このプロパティをSASL認証に使用する方法については、「SASL」を参照してください。LDAP認証メカニズムについては、RFC 2829 を参照してください。
このプロパティが設定されていない場合、java.naming.security.credentialsプロパティが設定されていないかぎり、そのデフォルト値はnoneです。設定されている場合、デフォルト値はsimpleです。このプロパティが、プロバイダで認識またはサポートされない値に設定されている場合は、AuthenticationNotSupportedExceptionがスローされます。
たとえば、
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5 CRAM-MD5");
env.put(Context.SECURITY_CREDENTIALS, "secret");
このプロパティの値は、認証対象のプリンシパルのアイデンティティを指定する文字列です。その形式は、認証タイプによって異なります。詳細は、RFC 2829を参照してください。この値は、SASL以外の認証のためのLDAP ASN.1 BindRequest内のnameコンポーネントとして使用されます。SASL認証の場合、このプロパティの値は、認証IDを必要とするSASLメカニズムの認証IDとして使用されます。
プロバイダが、プリンシパル名の有効性を検証する必要はありません。プロバイダは、たとえば、サーバーにより検証される文字列を渡すなどの処理を行うだけです。識別されたプリンシパルが有効なプリンシパルでない場合、プロバイダはAuthenticationExceptionをスローします。
このプロパティのデフォルト値は定義されていません。
たとえば、
env.put(Context.SECURITY_PRINCIPAL, "cn=admin,o=sun,c=us");
これは、プリンシパル名として識別名「cn=admin, o=sun, c=us」を設定します。
このプロパティがsslに設定されている場合、プロバイダはSSLソケットを使用する必要があります。それができない場合は、ConfigurationExceptionをスローする必要があります。上記の値リストに加え、プロバイダは他のセキュリティ・プロトコルをサポートすることもできます。ただし、そのようなプロバイダ固有のプロトコルを、すべてのプロバイダがサポートするわけではありません。このプロパティが、プロバイダで認識またはサポートされないセキュリティ・プロトコルに設定されている場合は、ConfigurationExceptionがスローされます。
java.naming.ldap.factory.socket プロパティが設定されている場合、そのプロパティで識別されるソケット・ファクトリは、このプロトコルの設定に適したソケットを作成する必要があります。たとえば、セキュリティ・プロトコルがsslに設定されている場合、ソケット・ファクトリはSSLに準拠したソケットを作成する必要があります。
このプロパティを設定しない場合には、セキュリティ・プロトコルを使用しないことがデフォルトになります。
LDAPプロバイダの開発者は、SSLを使用して、SSL接続を待機していないポートでサーバーに接続すると、ソケットがハング・アップすることに注意してください。同様に、SSL接続を待機するサーバーへの接続にプレーンなソケットを使用してもハング・アップが引き起こされます。これは、実装によっては訂正が実行されることはあるが、ほかの実装の場合には訂正を実行する必要はない、というプロトコルの特性です。ただし、プロバイダのドキュメント内で、この動作をユーザーに説明する必要があります。SSLの使用方法については、「SSL」を参照してください。
たとえば、
env.put(Context.SECURITY_PROTOCOL, "ssl");
属性ID | OID | 参照 |
---|---|---|
「;binary」オプションを持つ任意の属性ID。 | ||
photo | 0.9.2342.19200300.100.1.7 | RFC 1274 |
personalSignature | 0.9.2342.19200300.100.1.53 | RFC 1274 |
audio | 0.9.2342.19200300.100.1.55 | RFC 1274 |
jpegPhoto | 0.9.2342.19200300.100.1.60 | RFC 2798 |
javaSerializedData | 1.3.6.1.4.1.42.2.27.4.1.7 | RFC 2713 |
thumbnailPhoto | 2.16.128.113533.1.1400.1 | NAC LIP Schema |
thumbnailLogo | 2.16.128.113533.1.1400.2 | NAC LIP Schema |
userPassword | 2.5.4.35 | RFC 2256 |
userCertificate | 2.5.4.36 | RFC 2256 |
cACertificate | 2.5.4.37 | RFC 2256 |
authorityRevocationList | 2.5.4.38 | RFC 2256 |
certificateRevocationList | 2.5.4.39 | RFC 2256 |
crossCertificatePair | 2.5.4.40 | RFC 2256 |
x500UniqueIdentifier | 2.5.4.45 | RFC 2256 |
env.put("java.naming.ldap.control.connect", new Control[]{ new ManageReferralControl(true) });
たとえば、
env.put("java.naming.ldap.deleteRDN", "false");
このプロパティの値は、検索操作中に別名を間接参照する方法を指定する文字列です。次の値は、このプロパティ用に定義されたものです。
env.put("java.naming.ldap.derefAliases", "searching");
注: このプロパティは、SearchControlsオブジェクト内の間接参照リンク・フラグとは関係ありません。
env.put("java.naming.ldap.factory.socket", "javax.net.ssl.SSLSocketFactory");
env.put("java.naming.ldap.ref.separator", ":");
env.put("java.naming.ldap.referral.limit", "5");
このプロパティが設定されない場合、デフォルト値はfalseになります。
たとえば、
env.put("java.naming.ldap.typesOnly", "true");
このプロパティが設定されない場合、プロバイダはまずLDAP v3を使ってバインドを試みます。サーバーからプロトコル・エラーを受信するとLDAP v2を使って処理を継続します。このフェイルオーバー・メカニズムは、java.naming.security.authenticationプロパティが匿名バインドまたは簡単な認証を示している場合にのみ使用されます。
たとえば、
env.put("java.naming.ldap.version", "2");
java.naming.security.sasl.authorizationId
このプロパティの値は、SASLメカニズムの認証IDを指定する文字列です。
このプロパティを設定しないと、SASLメカニズムに渡される認証IDは空の文字列になります。SASL (RFC 2222)に従って、空の文字列の認証IDを使用すると、サーバーはクライアントの認証資格から認証IDを引き出します。
たとえば、
env.put("java.naming.security.sasl.authorizationId", "dn:cn=administrators,ou=groups,o=sun,c=us");
これは、認証の成功時に承認(アクセス・コントロール)用に使用される識別情報を指定します。
java.naming.security.sasl.realm
このプロパティの値は、DIGEST-MD5などいくつかのSASLメカニズムで必要な範囲情報を指定する文字列です。
このプロパティが設定されていない場合は、メカニズム固有のデフォルトで、認証交換が使用されている間にクライアントとサーバー間でのネゴシエーションなどが行われます。
たとえば、
env.put("java.naming.security.sasl.realm", "webusers");
クライアントが認証に「webusers」の範囲を使用するように指定します。
java.naming.security.sasl.callback
このプロパティの値は、javax.security.auth.callback.CallbackHandlerのインスタンスです。プロバイダがコールバックの必要なSASLメカニズムを使用する場合、SASLメカニズムはこのプロパティが提供するオブジェクトを使用します。コールバック・ハンドラは、認証IDを指定することによってNameCallbackの要件を満たします。
このプロパティが設定されていない場合、プロバイダは、java.naming.security.principalプロパティの値を使用してNameCallbackの要件を満たし、java.naming.security.credentialsプロパティの値を使用してPasswordCallbackの要件を満たし、さらにjava.naming.security.sasl.realmプロパティの値を使用して(Java SASL APIで説明されている) RealmCallbackとRealmChoiceCallbackの要件を満たすデフォルトのコールバック・ハンドラを使用します。
たとえば、
env.put("java.naming.security.sasl.callback", new MyCallbackHandler());
これは、使用するSASLメカニズムのコールバック・ハンドラのインスタンスを提供します。
このプロパティの値は、クライアントの保護の品質(qop)設定を指定するために使用される、qop値の「,」で区切られたリストです。qop値は、次のいずれかです。
このプロパティの値は、クライアントの設定を指定するために使用される、暗号強度値の「,」で区切られたリストです。強さを表す値は、次のいずれかです。
DIGEST-MD5でのプライバシの場合は、「high」が「3des」に、「medium」が「rc4」または「des」に、「low」が「rc4-56」または「rc4-40」にマップされます。
このプロパティの値は、クライアントが受信する受信バッファの最大サイズをバイト数で指定した整数の、文字列表現です。このプロパティが設定されない場合、デフォルトのサイズはSASLメカニズムで定義されます。
このプロパティの値は「true」または「false」のどちらかです。それぞれ、サーバーがクライアントに対して認証する必要の有無を指定します。このプロパティが設定されない場合、デフォルトは「false」です。
このプロパティの値は「true」または「false」のどちらかです。それぞれ、選択したSASLメカニズムがセッション間の転送機密性をサポートするかどうかを指定します。このプロパティが設定されない場合、デフォルトは「false」です。
このプロパティの値は「true」または「false」のどちらかです。それぞれ、選択したSASLメカニズムがクライアントの資格を必要とするかどうかを指定します。このプロパティが設定されない場合、デフォルトは「false」です。
このプロパティの値は「true」または「false」のどちらかです。それぞれ、選択したSASLメカニズムを、単純で受動的な攻撃の影響を受けにくくするかどうかを指定します。このプロパティが設定されない場合、デフォルトは「false」です。
このプロパティの値は「true」または「false」のどちらかです。それぞれ、選択したSASLメカニズムを、能動的な(辞書以外の)攻撃の影響を受けにくくするかどうかを指定します。このプロパティが設定されない場合、デフォルトは「false」です。
このプロパティの値は「true」または「false」のどちらかです。それぞれ、選択したSASLメカニズムが辞書攻撃の影響を受けにくくなるかどうかを指定します。このプロパティが設定されない場合、デフォルトは「false」です。
このプロパティの値は「true」または「false」のどちらかです。それぞれ、選択したSASLメカニズムが匿名のログインを許可しないかどうかを指定します。このプロパティが設定されない場合、デフォルトは「false」です。
LDAPコンテキストに提供される名前は、常にそのコンテキストに対する相対的なものです。たとえば、「dc=widget,dc=com」に対してLDAPコンテキスト(lctx)が与えられた場合、そのサブツリー内のLDAPエントリを指定するには、「dc=widget,dc=com」に対する相対名を指定する必要があります。たとえば、次の呼出しは、「cn=John Smith,dc=widget,dc=com」エントリの属性を取得します。
Attributes attrs = lctx.getAttributes("cn=John Smith");
同様に、コンテキストが列挙メソッド(Context.list、Context.listBindings、DirContext.search)のいずれかを使用して列挙されている場合、ターゲット・コンテキスト(列挙されているコンテキスト)に対する相対名が返されます。参照が呼び出されると、相対名の代わりに、完全修飾名を含むLDAPまたはLDAP URL文字列が返されます。(列挙がプレーン接続を使用して実行された場合はLDAP URL文字列が返され、SSL接続を使用して実行された場合はLDAPS URL文字列が返されます。)LDAP URLの形式は、RFC 2255で定義されています。
RFC 2255に従うLDAP URLとLDAPS URLは、任意のコンテキスト・メソッドに指定できます。ホスト名とポート番号はURLから抽出され、LDAPサーバーに接続する場合に使用されます。URLのスキーム(「ldap」または「ldaps」)は、プレーン接続とSSL接続のどちらが使用されるかを判断するために使用されます。java.naming.factory.initialおよびjava.naming.provider.urlプロパティは無視されます。次に例を示します。
DirContext ictx = new InitialDirContext();
Attributes attrs = ictx.getAttributes(
"ldap://wserver:389/cn=John Smith,dc=widget,dc=com");
このコード・フラグメントは、プレーン接続を使用して、マシンwserverのポート389にあるLDAPサーバーに接続します。
LDAPプロバイダは、すべての属性値を入力ではStringまたはbyte[]オブジェクトのどちらかとして予測し、出力でもこのどちらかとして返します。どの属性値がbyte[]として処理されるか、およびそのリストを拡張する方法については、java.naming.ldap.attributes.binary環境プロパティを参照してください。
ldap://host:port/dn?attributes?scope?filter?extensions
認証情報は、URLのextensions部分で指定できます。この形式の詳細については、RFCを参照してください。
LDAP URLのほかに、プロバイダは標準ではありませんが、広く使用されているLDAPS URLもサポートします。LDAPS URLはプレーン(すなわち保護されていない)接続の代わりにSSL接続を使用します。LDAPS URLの構文はLDAP URLと似ていますが、スキームは異なり、LDAPS URLのデフォルトのポートは389ではなく636です。
ldaps://host:port/dn?attributes?scope?filter?extensions
URLは、JNDIのさまざまな個所で次のような役割を果たします。
検索メソッドを除き、LDAPまたはLDAPS URLが名前として初期コンテキストに渡す場合、そのURLにはどのようなクエリー(「?」)コンポーネントも含めません。違反すると、サービス・プロバイダによってInvalidNameExceptionがスローされます。検索メソッドの場合、URLのクエリー・コンポーネントは引数として提供された対応するコンポーネントすべてより優先されます。たとえば、スコープ・コンポーネントを含むLDAP URLが指定されると、そのスコープはSearchControls引数で渡されるスコープ設定より優先されます。
Reference、Referenceable、およびSerializableオブジェクトは、RFC 2713に従って格納する必要があります。DirContextオブジェクトは、その属性を格納することによって格納されます。
RefAddrの参照のリストをjavaReferenceAddress属性に格納する場合、アドレスの位置、型、および内容を区切るために使用する区切り文字は、java.naming.ldap.ref.separator環境プロパティを使用して制御されます。この環境プロパティが指定されない場合、区切り文字としてハッシュ文字「#」が使用されます。
プロバイダは、オブジェクトをディレクトリ内に格納するときにDirectoryManager.getStateToBindメソッドを使用します。これにより、どんな型のオブジェクトでも上記の4つのカテゴリの1つに変換して、ディレクトリ内に格納できるようになります。
スキーマ・ツリーの内容を変更する権限は、ディレクトリ管理者により決定されます。スキーマ・ツリーが変更されると、変更はディレクトリ・サーバーに格納されたスキーマに適用されます。
バインディング名 | バインディングの説明 |
---|---|
AttributeDefinition | 属性定義ツリーのルート: 名前またはOIDで識別される属性を持つ、フラットな名前空間 |
ClassDefinition | 「objectclass」定義ツリーのルート: 名前またはOIDで識別されるオブジェクト・クラスを持つ、フラットな名前空間 |
SyntaxDefinition | 構文定義ツリーのルート: OIDで識別される構文を持つ、フラットな名前空間 |
MatchingRule | 一致規則ツリーのルート: 名前またはOIDで識別される一致規則を持つ、フラットな名前空間 |
ExtensionDefinition | 拡張機能ツリーのルート: OIDで識別される拡張機能を持つ、フラットな名前空間 |
ControlDefinition | コントロール・ツリーのルート: OIDで識別されるコントロールを持つ、フラットな名前空間 |
SASLMechanism | SASLツリーのルート: 文字列名で識別されるSASL認証メカニズムを持つ、フラットな名前空間 |
基盤となるディレクトリがこの種のスキーマ情報を公開しない場合、またはサービス・プロバイダがその取得をサポートしない場合には、これらのバインディングのいずれかまたはすべてが存在しないことがあり得ます。ただし、これらの名前がルート・スキーマ・コンテキスト内に存在する場合には、上記の表に示したバインディングを保持する必要があります。
これらのエントリの属性の属性名と値では、大文字と小文字が区別されません。
「AttributeDefinition」コンテキスト内の各オブジェクトには、次の必須およびオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子(OID) |
NAME | 属性の名前 |
DESC | 属性の説明 |
OBSOLETE | 現在使用されていない場合は「true」、その他の場合は「false」または値なし |
SUP | この属性型の派生元である、上位の属性型の名前 |
EQUALITY | 等価の一致が許可される場合には一致規則の名前またはOID、等価の一致が許可されない場合には値なし |
ORDERING | 順序付けされた一致が許可される場合には一致規則の名前またはOID、許可されない場合には値なし |
SUBSTRING | 部分文字列の一致が許可される場合には一致規則の名前またはOID、許可されない場合には値なし |
SYNTAX | この型の値の構文の数値OID |
SINGLE-VALUE | 属性が複数の値を保持しない場合は「true」、その他の場合は「false」または値なし |
COLLECTIVE | 属性が取得可能である場合は「true」、その他の場合は「false」または値なし |
NO-USER-MODIFICATION | ユーザーによる変更が不可能な場合は「true」、その他の場合は値なし |
USAGE | 属性の使用方法の説明 |
これらの属性は、「AttributeTypeDescription」に対してRFC 2252で定義されている名前と1対1で対応します。属性値はすべてjava.lang.Stringクラスによって表現されます。
たとえば、次のコードを使って「cn」属性を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext cnSchema = schema.lookup("AttributeDefinition/cn");
次に「cnSchema」DirContextオブジェクトの属性を取得すると、次のように表示されます。
NUMERICOID 2.5.4.3 NAME cn SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 DESC Standard Attribute, alias for commonName
「cn」属性をすでに保持している場合には、「cnSchema」を取得するもう1つの方法があります。次のコードで、その方法を示します。
Attributes attrs = ctx.getAttributes("cn=John", new String[]{"cn"}); Attribute cnAttr = attrs.get("cn"); DirContext cnSchema = cnAttr.getAttributeDefinition();
「ClassDefinition」コンテキスト内の各オブジェクトには、次の必須およびオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子(OID) |
NAME | オブジェクト・クラスの名前 |
DESC | オブジェクト・クラスの説明 |
OBSOLETE | 現在使用されていない場合は「true」、その他の場合は「false」または値なし |
SUP | このオブジェクト・クラスの派生元である、上位のオブジェクト・クラスの名前 |
ABSTRACT | オブジェクト・クラスが抽象クラスである場合は「true」、その他の場合は「false」または値なし |
STRUCTURAL | オブジェクト・クラスが構造化クラスである場合は「true」、その他の場合は「false」または値なし |
AUXILIARY | オブジェクト・クラスが補助クラスである場合は「true」、その他の場合は「false」または値なし |
MUST | 存在する必要のある属性の型名のリスト |
MAY | 存在する可能性のある属性の型名のリスト |
これらの属性は、「ObjectClassDescription」に対してRFC 2252で定義されている名前と1対1で対応します。属性値はすべてjava.lang.Stringクラスによって表現されます。
たとえば、次のコードを使って「country」オブジェクト・クラスを表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext countrySchema = schema.lookup("ClassDefinition/country");
次に「countrySchema」DirContextオブジェクトの属性を取得すると、次のように表示されます。
NUMERICOID 2.5.6.2 NAME country MAY aci, searchguide, description MUST objectclass, c DESC Standard ObjectClass SUP top
「country」オブジェクトをすでに保持している場合、「countrySchema」を取得するもう1つの方法があります。次のコードで、その方法を示します。
// Read object from directory DirContext countryObj = (DirContext)ctx.lookup("c=us", new String[]{"country"}); // Get all of object's object class definitions DirContext objClasses = countryAttr.getSchemaClassDefinition(); // Pick out "country" object class in particular DirContext countryClass = (DirContext)objClasses.lookup("country");
注: getSchemaClassDefinition()のJNDI 1.1の仕様では、サービス・プロバイダはオブジェクトのオブジェクト・クラス定義のいずれかを返すことになっています。オブジェクトは通常複数のオブジェクト・クラスを保持すること、およびアプリケーションは実行中の動作に基づき、これらのオブジェクト・クラスのいずれかに関する知識を必要とすることから、この仕様は不適切です。上の例では、オブジェクト・クラス定義をすべて含むコンテキストが返されます。
「SyntaxDefinition」コンテキスト内の各オブジェクトには、次の必須およびオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子(OID) |
DESC | 構文の説明 |
これらの属性は、「SyntaxDescription」に対してRFC 2252で定義されている名前と1対1で対応します。属性値はすべてjava.lang.Stringクラスによって表現されます。
たとえば、次のコードを使って、「1.3.6.1.4.1.1466.115.121.1.15」構文を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext dirStringSchema = schema.lookup("SyntaxDefinition/1.3.6.1.4.1.1466.115.121.1.15");
次に「dirStringSchema」DirContextオブジェクトの属性を取得すると、次のように表示されます。
NUMERICOID 1.3.6.1.4.1.1466.115.121.1.15 DESC Directory String
その構文を保持する属性(「country」属性など)をすでに取得しているのであれば、「dirStringSchema」を取得する等価な方法が存在します。次のコードで、その方法を示します。
Attributes attrs = ctx.getAttributes("c=us", new String[]{"country"}); Attribute countryAttr = attrs.get("country"); DirContext dirStringSchema = countryAttr.getSyntaxAttributeDefinition();
一致規則が拡張可能な規則の場合、「APPLIES」属性も含んでいる必要があります。この属性は、この拡張可能な一致規則に適用可能な属性を一覧表示します。
「MatchingRule」コンテキスト内の各オブジェクトには、次の必須およびオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子(OID) |
NAME | 一致規則の名前 |
DESC | 一致規則の説明 |
OBSOLETE | 現在使用されていない場合は「true」、その他の場合は「false」または値なし |
SYNTAX | この規則の適用対象の構文の数値OID |
APPLIES | この拡張可能な一致規則の適用対象属性の型名のリスト |
これらの属性は、「MatchingRuleDescription」および「MatchingRuleUseDescription」に対してRFC 2252で定義されている名前と1対1で対応します。属性値はすべてjava.lang.Stringクラスによって表現されます。
たとえば、次のコードを使って「soundAlikeMatch」構文を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext soundMatchSchema = schema.lookup("MatchingRule/soundAlikeMatch");
次に「soundMatchSchema」DirContextオブジェクトの属性を取得すると、次のように表示されます。
NUMERICOID 1.2.3.4.5 NAME soundAlikeMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 (for directory string) APPLIES 2.5.4.41, 2.5.4.15 DESC Home-grown Phonetic match
「ExtensionDefinition」コンテキスト内の各オブジェクトには、次の必須およびオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子(OID) |
DESC | 拡張機能の説明 |
属性値はすべてjava.lang.Stringクラスによって表現されます。
たとえば、次のコードを使って、Start TLS拡張機能(「1.3.6.1.4.1.1466.20037」)を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext startTLSSchema = schema.lookup("ExtensionDefinition/1.3.6.1.4.1.1466.20037");
次に「startTLSSchema」DirContextオブジェクトの属性を取得すると、次のように表示されます。
NUMERICOID 1.3.6.1.4.1.1466.20037 DESC Start TLS (see RFC 2830)
「ControlDefinition」コンテキスト内の各オブジェクトには、次の必須およびオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子(文字列) |
DESC | コントロールの説明 |
属性値はすべてjava.lang.Stringクラスによって表現されます。
たとえば、次のコードを使用して、サーバー側ソート・コントロール (「1.2.840.113556.1.4.473」)を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext svrSortSchema = schema.lookup("ControlDefinition/1.2.840.113556.1.4.473");
次に「svrSortSchema」DirContextオブジェクトの属性を取得すると、次のように表示されます。
NUMERICOID 1.2.840.113556.1.4.473 DESC server-side sorting of search results
「SASLMechanism」コンテキスト内の各オブジェクトには、次の必須およびオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NAME (必須) | SASLメカニズムの名前 |
DESC | SASLメカニズムの説明 |
属性値はすべてjava.lang.Stringクラスによって表現されます。
たとえば、次のコードを使ってEXTERNAL SASLメカニズムを表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext saslExternalSchema = schema.lookup("SASLMechanism/EXTERNAL");次に「saslExternalSchema」DirContextオブジェクトの属性を取得すると、次のように表示されます。
NAME EXTERNAL DESC EXTERNAL SASL mechanism (RFC 2222)
LDAPエラー・コード | 例外またはアクション |
---|---|
success (0) | 成功を報告する |
operationsError (1) | NamingException |
protocolError (2) | CommunicationException |
timeLimitExceeded (3) | TimeLimitExceededException |
sizeLimitExceeded (4) | SizeLimitExceededException |
compareFalse (5) | DirContext.search()によって使用され、例外を生成しません。 |
compareTrue (6) | DirContext.search()によって使用され、例外を生成しません。 |
authMethodNotSupported (7) | AuthenticationNotSupportedException |
strongAuthRequired (8) | AuthenticationNotSupportedException |
partialResults (9) | java.naming.referralがignoreに設定されているか、またはエラーの内容に照会が含まれていない場合は、PartialResultExceptionをスローします。それ以外の場合、その内容を使用して照会を構築します。 |
referral (10) | java.naming.referralがignoreに設定されている場合は、PartialResultExceptionをスローします。それがthrowに設定されている場合は、ReferralExceptionをスローします。それがfollowに設定されている場合、プロバイダは照会に従います。照会に従っている間にjava.naming.ldap.referral.limitの値を超えた場合は、LimitExceededExceptionをスローします。 |
adminLimitExceeded (11) | LimitExceededException |
unavailableCriticalExtension (12) | OperationNotSupportedException |
confidentialityRequired (13) | AuthenticationNotSupportedException |
saslBindInProgress (14) | マルチ・ステージのSASL認証中に、LDAPプロバイダにより内部で使用される |
noSuchAttribute (16) | NoSuchAttributeException |
undefinedAttributeType (17) | InvalidAttributeIdentifierException |
inappropriateMatching (18) | InvalidSearchFilterException |
constraintViolation (19) | InvalidAttributeValueException |
attributeOrValueExists (20) | AttributeInUseException |
invalidAttributeSyntax (21) | InvalidAttributeValueException |
noSuchObject (32) | NameNotFoundException |
aliasProblem (33) | NamingException |
invalidDNSyntax (34) | InvalidNameException |
isLeaf (35) | プロバイダが使用。通常例外を生成しない |
aliasDereferencingProblem (36) | NamingException |
inappropriateAuthentication (48) | AuthenticationNotSupportedException |
invalidCredentials (49) | AuthenticationException |
insufficientAccessRights (50) | NoPermissionException |
busy (51) | ServiceUnavailableException |
unavailable (52) | ServiceUnavailableException |
unwillingToPerform (53) | OperationNotSupportedException |
loopDetect (54) | NamingException |
namingViolation (64) | InvalidNameException |
objectClassViolation (65) | SchemaViolationException |
notAllowedOnNonLeaf (66) | ContextNotEmptyException |
notAllowedOnRDN (67) | SchemaViolationException |
entryAlreadyExists (68) | NameAlreadyBoundException |
objectClassModsProhibited (69) | SchemaViolationException |
affectsMultipleDSAs (71) | NamingException |
other (80) | NamingException |
コンテキストの環境プロパティを更新します。複数のコンテキストが同じ環境プロパティのセットを共有する場合、プロバイダは目的のコンテキストの環境だけを修正するよう注意する必要があります。環境プロパティを変更すると、コンテキストが使用している既存の接続も変更しなければならない場合があります。
コンテキストの環境プロパティを削除します。複数のコンテキストが同じ環境プロパティのセットを共有する場合、プロバイダは目的のコンテキストの環境だけを修正するよう注意する必要があります。環境プロパティを変更すると、コンテキストが使用している既存の接続も変更しなければならない場合があります。
引数として文字列フィルタを受け入れる検索の形式では、Unicode文字も許可されるという点を除き、フィルタの構文はRFC 2254に従います。エンコードされたUTF-8オクテットよりもUnicode文字を使用することが推奨されています。サービス・プロバイダは、サーバーに転送するためにUnicode文字を、対応するUTF-8表現に翻訳する役割を担います。たとえば、ギリシャ文字のアルファは、文字列フィルタ内で「\u03B1」または「\\CE\\B1」として指定できます。
search(Name, Attributes)および関連メソッドの形式では、Attributes引数は、その要素から論理積を作成することによって文字列フィルタに変換されます。各属性値はリテラルとして処理されるため、属性の値に現れる「*」やRFC 2254で定義されているその他の特殊文字は、RFC 2254の規則に従ってエスケープする必要があります。たとえば、「*」の属性値は、文字列「\\2a」としてエンコードする必要があります。
search(Name, String filterExpr, Object[] filterArgs)およびそのStringでオーバーロードされたメソッドの形式では、filterArgsから値を入力することによって、フィルタ内で「{num}」の展開が実行されます。各「{num}」コンポーネントは、RFC 2254のセクション4にある「attr」または「value」の代わりに使用できます。
filterArgs内のオブジェクトは、次の方法でエンコードする必要があります。
Java SASL APIは、Java Authentication and Authorization Service (JAAS)に依存しています。JAASは、ユーザー/アプリケーション情報を直接取得または提供する必要のあるSASLメカニズムのコールバック・サポートを提供します。
SASLメカニズムの中には、認証されるエンティティの識別情報を要求するものもあります。これは、認証IDと呼ばれます。SASLメカニズムによっては、DIGEST-MD5のように、パスワードや範囲の使用が要件となっているものもあります。デフォルトでは、プロバイダはjava.naming.security.principalプロパティの値を認証IDが必要な任意のSASLメカニズムへの認証IDとして、java.naming.security.credentialsプロパティの値をパスワードとして、さらにjava.naming.security.sasl.realmプロパティの値を範囲として提供します。これらのデフォルトをオーバーライドするには、java.naming.security.sasl.callbackプロパティを使用します。
SASLメカニズムは、認証が成功したらサーバーがアクセスを許可する対象のエンティティである認証識別情報または認証IDの概念をサポートしています。java.naming.security.sasl.authorizationIdプロパティが設定されている場合は、その値が認証IDとして使用されます。そうでない場合は、空の文字列が認証IDとして使用されます。これによって、サーバーはクライアントの認証資格から認証IDを作成します。
SASLをサポートするためにLDAPサービス・プロバイダによって使用されるプロパティについては、「SASLプロパティ」を参照してください。
これらのプロパティに加え、特定のSASLメカニズムで必要とされるプロパティも存在します。たとえば、機密性と完全性をサポートするSASLメカニズムは、クライアントが要求する保護の品質を認識している必要があります。こうしたプロパティは、環境プロパティ経由でSASLメカニズムに渡されます。環境プロパティを設定する方法については、JNDIのドキュメントを参照してください。
たとえば、アプリケーションで機密性が必要な場合は次のような呼出しを使います。
env.put("javax.security.sasl.qop", "auth-conf");
このコードは、初期コンテキスト・コンストラクタにenvを渡す前に実行します。これらのプロパティの詳細については、「Java SASL API」を参照してください。
IETF LDAPEXTワーキング・グループにより、いくつかのLDAP拡張機能およびコントロールが定義されています。
「Start TLS」拡張機能 (「1.3.6.1.4.1.1466.20037」)は、StartTlsRequestおよびStartTlsResponseクラスでサポートされます。LDAPプロバイダは、抽象StartTlsResponseクラスの固定実装を提供し、その実装をLDAPプロバイダが使用できるようにする必要があります。StartTlsRequest.createExtendedResponseの説明を参照してください。通常、StartTlsResponseの実装にはLDAPプロバイダのデータ構造へのアクセスが必要です。
LDAPサービス・プロバイダは、RFC 2830で規定されているStart TLSネゴシエーションのあとにホスト名の検証を実行するべきです。DNSの情報を使用してLDAPサーバーが自動的に検出された場合(「URL」を参照)、draft-ietf-ldapext-locate-08.txtで推奨されているように、プロバイダは識別名から派生されたドメイン名をホスト名として使用して検証するべきです。
JNDIアプリケーションは、ディレクトリ内で発生するイベント(エントリの追加または削除、エントリの変更など)を登録できます。アプリケーションはまた、非要請通知も登録できます。
このプロバイダは、Java Secure Socket Extension (JSSE)仕様に従ってSSLをサポートします。SSLは、java.naming.security.protocol環境プロパティを次のように設定することによって起動できます。
env.put(Context.SECURITY_PROTOCOL, "ssl");また、SSLをサポートするLDAPサーバーのホスト名とポート番号を選択しても、SSLを起動できます。SSL接続がいったん確立されると、後続のLDAPプロトコル交換はその保護接続経由で行われます。
さらに、LDAP認証も必要な場合は、必要に応じてjava.naming.security.authentication、java.naming.security.principal、およびjava.naming.security.credentials環境プロパティを設定する必要があります。LDAP認証が必要であり、かつSSL資格をLDAP認証に再利用する必要がある場合は、次のように、SASL EXTERNALメカニズムを選択するようにjava.naming.security.authentication環境プロパティを設定します。
env.put(Context.SECURITY_AUTHENTICATION, "EXTERNAL");