LDAP サービスプロバイダに対する JNDI 実装側のガイドライン

Draft 0.4.2

目次
 
1. はじめに
2. 適合性
3. 環境プロパティー
4. 名前
5. 属性
6. URL
7. Java オブジェクト
8. スキーマ
9. 例外
10. API マッピング
11. 連合
12. SASL
13. 拡張機能およびコントロール
14. イベントの通知
15. SSL
 

1. はじめに

このドキュメントは、LDAP サービスプロバイダを作成する開発者、および LDAP と類似した機能をサポートするプロバイダが従う必要のあるガイドラインについて説明します。これらのガイドラインに従うことにより、開発者は、JNDI API ユーザーがこれまでの操作や技術との違いを意識することを最小限に押さえて設定および使用可能な実装を作成できます。

このドキュメントで説明するすべての機能を、LDAP サービスプロバイダがサポートしなければならないわけではありません。ただし、ある機能をサポートする場合、そのサポート方法はこのドキュメントに説明された方法に従う必要があります。



2. 適合性

LDAP バージョン 3 (LDAPv3) をサポートする LDAP サービスプロバイダは、次に適合しています。 LDAP バージョン 2 (LDAPv2) をサポートする LDAP サービスプロバイダは、次に適合しています。

3. 環境プロパティー

環境プロパティーは、JNDI アプリケーションユーザーが JNDI サービスプロバイダの動作を設定および変更するための手段です。このため、各サービスプロバイダは環境プロパティーを同じ方法で解釈および処理する必要があります。

LDAP サービスプロバイダに影響を及ぼす環境プロパティーには 4 つのタイプがあります。

3.1 概要

3.1.1 初期化

初期コンテキストを作成する場合は、環境プロパティーを引数としてコンストラクタに渡すか、または JNDI のドキュメントで指定されているように初期化できます。

特に、次のプロパティーのいずれかが環境プロパティー内で提供されていない場合、システムプロパティー、アプレットパラメータ、およびプロバイダとアプリケーションのリソースファイルの両方から、次に示す順序で検索されます。

コントロール、オブジェクト、および状態ファクトリプロパティーの場合は、プロパティーが複数回出現していることが検出されると、それらの値が 1 つのリストに連結されます。url プロパティーおよびほかのすべてのプロパティーの場合、最初に出現したものだけが使用されます。

コンテキストの環境プロパティーは、Context.getEnvironment メソッドを使用して検査できます。

3.1.2 変更

コンテキストの環境プロパティーは、Context.addToEnvironment および Context.removeFromEnvironment メソッドを使用して変更できます。

3.1.3 スコープ

java.naming.provider.url および java.naming.factory.initial プロパティーを除き、Context.addToEnvironment または Context.removeFromEnvironment メソッドを使用してプロパティーを変更すると、そのメソッドが呼び出されたコンテキストインスタンスに影響を与えます。たとえば、コンテキストで使用される新しい資格を指定した場合は、そのコンテキストで呼び出される後続のメソッドでサーバーとの通信が行われるときに、新しい資格が使用されます。内部的には、最初にサーバーに新しい接続が確立されるときに使用されます。更新された環境プロパティーは、更新が適用されたコンテキストインスタンスから派生したコンテキストインスタンスに継承されます。ただし、更新以前に生成されたコンテキストインスタンスには継承されません。

3.1.4 変更スケジュール

環境プロパティーに変更が加えられる場合は、Context.addToEnvironment または Context.removeFromEnvironment メソッドの呼び出し時に、その変更を検証したり有効にしたりする必要はありません。必要なのは、そのプロパティーを使用する操作が次回呼び出されるときに、その (1 つまたは複数の) 変更を有効にすることだけです。

3.1.5 デフォルト

この仕様で、環境プロパティーのデフォルトを定義します。デフォルトがサービスプロバイダによって決定される場合もあります。コンテキストが特定の環境プロパティーを保持しない場合、コンテキストはデフォルト値の環境プロパティーを保持しているかのように動作します。

コンテキストの環境プロパティーからあるプロパティーを削除する場合、コンテキストはそのプロパティーにはデフォルトの動作が割り当てられているものとみなします。ただし、プロパティーの値としてデフォルト値を指定しなければならないという意味ではありません。削除は、コンテキストの環境プロパティーにそのプロパティーが存在しないことによっても示されます。

3.1.6 設定可能な値

この仕様は、環境プロパティーに設定可能な値を定義します。環境プロパティーには、設定値が固定されているものと、特定の構文に従って値を設定するものがあります。設定できない値が指定された場合は、プロパティー固有の例外 (ConfigurationExceptionIllegalArgumentExceptionAuthenticationNotSupportedException など) がスローされます。この場合、サービスプロバイダに設定できる値に、定義された値以外の値を追加する方が適切なことがあります。追加する場合は、それらの値をドキュメントに明記する必要があります。

3.2 JNDI プロパティー

LDAP サービスプロバイダは、次の仕様に従って JNDI 環境プロパティーを処理する必要があります。示されている例で、env は、初期コンテキストを作成するために使用される環境プロパティーを保持する Hashtable のインスタンスです。

java.naming.batchsize

このプロパティーの値は、サーバーから返される検索結果のバッチサイズを指定する 10 進数の文字列です。

このプロパティーは、Context.listContext.listBindingsDirContext.search の各メソッドと、これらのメソッドが返す NamingEnumeration オブジェクトのブロック動作に影響を与えます。これは、返される列挙内の項目数には影響しません。LDAP プロトコルレベルで項目のバッチ処理または読み取りが行われる方法だけに影響を与えます。

値をゼロに設定すると、それは、すべての結果が受け取られるまでプロバイダがブロックすることを意味します。0 より大きい整数 n を設定することは、サーバーから n 個の結果が受信されるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法でプロバイダがブロックすべきであることを示します。アプリケーションが (NamingEnumeration.next または NamingEnumeration.nextElement を使用して) n 個の結果を読み取ったあと、プロバイダは、サーバーからさらに n 個の結果が受信されるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法で読み取るべきです。

このプロパティーが設定されない場合、デフォルト値は実装固有の値になります。

たとえば、次のコードは、サーバーから 24 個のエントリが読み取られるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法でプロバイダがブロックすべきであることを指定します。

env.put(Context.BATCHSIZE, "24");
java.naming.factory.control

このプロパティーの値は、コントロールファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。

ファクトリは、応答コントロールを行うクラスのナロー変換を行います。これらのファクトリは、プロバイダが生成する一般的な応答コントロールから固有の応答コントロールを作成します。

このプロパティーのデフォルト値は定義されていません。

たとえば、次のコードは、ResponseControlFactory クラスを試行対象のコントロールファクトリとして設定します。

env.put(LdapContext.CONTROL_FACTORIES,
        "com.sun.jndi.ldap.ctl.ResponseControlFactory");
java.naming.factory.initial

このプロパティーの値は、LDAP サービスプロバイダの初期コンテキストを作成するファクトリクラスの完全修飾されたクラス名です。

これは、特定の LDAP サービスプロバイダを選択するために使用します。プロバイダ自身が使用することはありません。初期コンテキストメソッドへの名前引数が URL である場合には、このプロパティーを設定する必要はありません。

このプロパティーのデフォルト値は定義されていません。

たとえば、次のコードは、Sun の LDAP プロバイダを選択します。

env.put(Context.INITIAL_CONTEXT_FACTORY,
        "com.sun.jndi.ldap.LdapCtxFactory");
java.naming.factory.object

このプロパティーの値は、オブジェクトファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。

ファクトリは、プロバイダから返された LDAP エントリから特定のオブジェクトを作成します。たとえば、Person オブジェクトファクトリが、オブジェクトクラス person の LDAP エントリから Person オブジェクトを生成するとします。オブジェクトファクトリは、LDAP 属性からオブジェクトを生成するという点で、状態ファクトリとは反対の動作を行います。

このプロパティーのデフォルト値は定義されていません。

次に例を示します。

env.put(Context.OBJECT_FACTORIES,
        "com.sun.jndi.ldap.obj.PersonFromLDAP");
これは、PersonFromLDAP クラスを試行対象のオブジェクトファクトリとして設定します。
java.naming.factory.state

このプロパティーの値は、状態ファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。

このファクトリは、オブジェクト自体からオブジェクトの状態 (格納用) を作成します。たとえば、Person 状態ファクトリが、Person オブジェクトからオブジェクトクラス person の LDAP エントリを生成するとします。状態ファクトリは、オブジェクトから LDAP 属性を生成するという点で、オブジェクトファクトリとは反対の動作を行います。

このプロパティーのデフォルト値は定義されていません。

次に例を示します。

env.put(Context.STATE_FACTORIES,
        "com.sun.jndi.ldap.obj.PersonToLDAP");

これは、PersonToLDAP クラスを試行対象の状態ファクトリとして設定します。

java.naming.language

このプロパティーの値は、RFC 1766 に従った文字列言語タグです。

このプロパティーは、特定の自然言語の優先順位を示します。プロバイダは、その LDAP 要求および応答をこのプロパティーの値に従って調整できます。
このプロパティーが与える影響は、実装固有です。デフォルト値は定義されていません。
たとえば、
env.put(Context.LANGUAGE, "ja-JP");
これは、日本語が優先されることを示します。
java.naming.provider.url

このプロパティーの値は、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 メソッドを使用してこのプロパティーを変更しても、コンテキストには影響を与えません。このプロパティーを使用するのは、初期コンテキストコンストラクタだけです。

java.naming.referral

このプロパティーの値は、プロバイダが照会を処理する方法を指定する文字列です。次の値は、このプロパティー用に定義されたものです。

follow
自動的にすべての照会に従います。
throw
各照会に対して ReferralException をスローします。
ignore
結果に表示される照会を無視します。未完了の結果を示すために、PartialResultException がスローされます。また、LDAPv3 サーバーの場合、プロバイダは、照会がエントリ内に表示されると、通常の属性として照会を処理することを要求します。これは、各 LDAP 要求で、クリティカルではない ManageDsaIT (RFC 3296) LDAP コントロールを送信することによって実現されます。この LDAP コントロールをサポートしない LDAP サーバーは、単に照会を無視して要求を通常に処理します。

1 つの照会エントリで検出された複数の URL を処理する方法については、「URL」を参照してください。

このプロパティーが設定されていない場合、そのデフォルト値は ignore です。

たとえば、

env.put(Context.REFERRAL, "throw");
これは、LDAP 操作中に照会が検出された場合はアプリケーションに ReferralException をスローするべきであることを指定します。
java.naming.security.authentication

このプロパティーの値は、使用するプロバイダ用の認証メカニズムを指定する文字列です。次の値は、このプロパティー用に定義されたものです。

なし
認証を使用しません (匿名バインド)。
simple
簡単な認証を使用します (クリアテキストパスワード)。
1 つ以上の SASL メカニズム名の空白で区切られたリスト:
リスト内で、指定したポリシー要件に準拠する最初に利用可能な SASL メカニズムを使用します。

このプロパティーを SASL 認証に使用する方法については、「SASL」を参照してください。LDAP 認証メカニズムについては、RFC 2829 を参照してください。

このプロパティーが設定されていない場合、java.naming.security.credentials プロパティーが設定されていないかぎり、そのデフォルト値は none です。設定されている場合、デフォルト値は simple です。このプロパティーが、プロバイダで認識またはサポートされない値に設定されている場合は、AuthenticationNotSupportedException がスローされます。

たとえば、

env.put(Context.SECURITY_AUTHENTICATION, "simple");
これは、LDAP サーバーの認証に簡単な認証が使用されることを示します。または、次のように記述します。
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5 CRAM-MD5");
これは、DIGEST-MD5 認証を使用するか、または SASL メカニズムが利用不可能な場合には CRAM-MD5 認証を使用することを示します。どちらも使用できない場合は、AuthenticationNotSupportedException がスローされます。
java.naming.security.credentials
このプロパティーの値は、認証対象のプリンシパルの資格を指定するオブジェクトです。その形式と処理は、java.naming.security.authentication プロパティーの値によって異なります。
匿名バインドの場合、このプロパティーは無視され、常に空白文字列が資格として使用されます。簡単な認証およびパスワードが必要な SASL 認証の場合は、このプロパティーの値を java.lang.Stringchar[]、または byte[] として指定できます。これが String または char[] の場合は、LDAPv3 では UTF-8 を使用してバイト配列にエンコードされ、LDAPv2 では ISO-Latin-1 を使用してエンコードされます。これが byte[] である場合は、そのまま使用されます。
このプロパティーを SASL 認証に使用する方法については、「SASL」を参照してください。
このプロパティーのデフォルト値は定義されていません。
たとえば、
env.put(Context.SECURITY_CREDENTIALS, "secret");
これは、資格を文字列「secret」に設定します。
java.naming.security.principal

このプロパティーの値は、認証対象のプリンシパルのアイデンティティーを指定する文字列です。その形式は、認証タイプによって異なります。詳細は、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」を設定します。

java.naming.security.protocol
このプロパティーの値は、使用するプロバイダ用のセキュリティープロトコルを指定する文字列です。このプロパティーに対して、次の値が定義されています。
 
ssl
Secure Sockets Layer バージョン 3.0 を使用します。

このプロパティーが ssl に設定されている場合、プロバイダは SSL ソケットを使用する必要があります。それができない場合は、ConfigurationException をスローする必要があります。上記の値リストに加え、プロバイダはほかのセキュリティープロトコルをサポートすることもできます。ただし、そのようなプロバイダ固有のプロトコルを、すべてのプロバイダがサポートするわけではありません。このプロパティーが、プロバイダで認識またはサポートされないセキュリティープロトコルに設定されている場合は、ConfigurationException がスローされます。

java.naming.ldap.factory.socket プロパティーが設定されている場合、そのプロパティーで識別されるソケットファクトリは、このプロトコルの設定に適したソケットを作成する必要があります。たとえば、セキュリティープロトコルが ssl に設定されている場合、ソケットファクトリは SSL に準拠したソケットを作成する必要があります。

このプロパティーを設定しない場合には、セキュリティープロトコルを使用しないことがデフォルトになります。

LDAP プロバイダの開発者は、SSL を使用して、SSL 接続を待機していないポートでサーバーに接続すると、ソケットがハングアップすることに注意してください。同様に、SSL 接続を待機するサーバーへの接続にプレーンなソケットを使用してもハングアップが引き起こされます。これは、実装によっては訂正が実行されることはあるが、ほかの実装の場合には訂正を実行する必要はない、というプロトコルの特性です。ただし、プロバイダのドキュメント内で、この動作をユーザーに説明する必要があります。SSL の使用方法については、「SSL」を参照してください。

たとえば、

env.put(Context.SECURITY_PROTOCOL, "ssl");
これは、サーバーとの通信に SSL 準拠のソケットを使用することを示します。

3.3 LDAP 固有のプロパティー

LDAP 固有のプロパティーは、LDAP サービスプロバイダ全般に適用される環境プロパティーです。これらのプロパティーの名前には、接頭辞「java.naming.ldap.」が付きます。次の表は、これまでに定義された LDAP 固有のプロパティーを示します。

java.naming.ldap.attributes.binary
このプロパティーの値は、空白文字で区切られた属性名の文字列です。この値を使って、非文字列構文を保持する属性が指定されます。これは、プロバイダの非文字列属性の組み込みのリストを拡張します (下を参照)。非文字列の構文を持つ属性の値は、String ではなくバイト配列 (byte[]) として返されます。
デフォルトは定義されていません。このプロパティーが設定されない場合、次の属性だけが非文字列構文を保持するとみなされます。
属性 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.attributes.binary",
        "mpegVideo myspecialkey");
これは、プロバイダに mpegVideo および myspecialkey 属性の値を byte[] として返すことを通知します。
java.naming.ldap.control.connect
このプロパティーの値は、Control[] オブジェクトです。これは、接続時にアクティブな接続要求コントロールを設定します。LdapContext を参照してください。
このプロパティーのデフォルト値は定義されていません。
たとえば、
env.put("java.naming.ldap.control.connect",
        new Control[]{ new ManageReferralControl(true) });
これは、クリティカルな ManageDsaIT LDAP コントロールを接続要求コントロールとして設定します。

java.naming.ldap.deleteRDN
このプロパティーの値は、古い RDN が Context.rename メソッドによって削除されるかどうかを指定する文字列です。このプロパティーには次の値が定義されています。
 
true
名前の変更操作中に、旧来の RDN をエントリから削除します。
false
旧来の RDN をエントリの属性値として保持します。

 
このプロパティーが設定されていない場合、そのデフォルト値は true になります。

たとえば、

env.put("java.naming.ldap.deleteRDN", "false");
これは、旧来の RDN を、名前の変更されたエントリの属性として保持します。

java.naming.ldap.derefAliases

このプロパティーの値は、検索操作中に別名を間接参照する方法を指定する文字列です。次の値は、このプロパティー用に定義されたものです。

always
常に別名を間接参照します。
never
別名を間接参照しません。
finding
名前解決中 (つまり、ターゲットエントリの位置の検出中) だけ別名を間接参照します。
searching
名前解決完了後 (つまり、ターゲットエントリの位置検出後) に別名を間接参照します。
このプロパティーが設定されていない場合、そのデフォルト値は always になります。
たとえば、
env.put("java.naming.ldap.derefAliases", "searching");
これは、ターゲットエントリの検出後に、プロバイダが一度だけ別名を間接参照するよう指定します。

: このプロパティーは、SearchControls オブジェクト内の間接参照リンクフラグとは関係ありません。

java.naming.ldap.factory.socket
このプロパティーの値は、ソケットファクトリのクラス名を識別する文字列です。
このプロパティーは、デフォルトのソケットファクトリをオーバーライドするために使用されます。このプロパティーで指定されたクラスは、javax.net.SocketFactory インタフェースを実装する必要があります。詳細は、「JSSE リファレンスガイド」を参照してください。SSL の使用方法については、「SSL」を参照してください。
さらに、java.naming.security.protocol プロパティーが設定されている場合、このプロパティーで識別されるソケットファクトリは、そのプロトコルの設定に適したソケットを作成する必要があります。たとえば、セキュリティープロトコルが ssl に設定されている場合、ソケットファクトリは SSL に準拠したソケットを作成する必要があります。
このプロパティーのデフォルトは定義されていません。
たとえば、
env.put("java.naming.ldap.factory.socket",
        "javax.net.ssl.SSLSocketFactory");
これは、プロバイダのソケットファクトリを javax.net.ssl.SSLSocketFactory に設定します。

java.naming.ldap.ref.separator
このプロパティーの値は、javaReferenceAddress 属性内の RefAddr オブジェクトをエンコードするときに使用する文字を含む文字列です (「Java オブジェクト」を参照)。
このプロパティーは、RefAddr オブジェクトのコンポーネントにデフォルトの区切り文字が現れる場合に、衝突を回避するために使用されます。
このプロパティーが設定されていない場合、そのデフォルト値は「#」(ハッシュ文字) になります。
たとえば、
env.put("java.naming.ldap.ref.separator", ":");
これは、RefAddr インスタンスの格納時に区切り文字「:」(コロン文字) を使用することを指定します。

java.naming.ldap.referral.limit
このプロパティーの値は、照会の連鎖内で続く照会の最大数を指定する 10 進数の文字列です。0 の設定は、制限がないことを示します。
このプロパティーが設定されていない場合、そのデフォルト値は 10 です。
たとえば、
env.put("java.naming.ldap.referral.limit", "5");
これは、照会数を 5 に制限します。

java.naming.ldap.typesOnly
このプロパティーの値は、結果内に属性 ID だけが返される (属性値は省略される) かどうかを指定する文字列です。SearchResult.getAttributes および DirContext.getAttributes メソッドに影響を与えます。このプロパティーには次の値が定義されています。
 
true
属性 ID だけを返します。
false
属性 ID と属性値の両方を返します。

このプロパティーが設定されない場合、デフォルト値は false になります。

たとえば、

env.put("java.naming.ldap.typesOnly", "true");
これは、サーバーが属性 ID を返し、属性値は返さないことを指定します。
java.naming.ldap.version
このプロパティーの値は、プロバイダのプロトコルバージョンを指定する文字列です。このプロパティーには次の値が定義されています。
 
2
LDAP バージョン 2 (LDAPv2) を選択します。
3
LDAP バージョン 3 (LDAPv3) を選択します。

このプロパティーが設定されない場合、プロバイダはまず LDAP v3 を使ってバインドを試みます。サーバーからプロトコルエラーを受信すると LDAP v2 を使って処理を継続します。このフェイルオーバーメカニズムは、java.naming.security.authentication プロパティーが匿名バインドまたは簡単な認証を示している場合にのみ使用されます。

たとえば、

env.put("java.naming.ldap.version", "2");
これは、LDAP プロバイダが LDAPv2 を使用してサーバーと通信することを要求します。

3.4 機能固有のプロパティー

機能固有のプロパティーは、プロバイダがサポートする特定の機能だけに適用される環境プロパティーです。

3.4.1 SASL プロパティー

SASL プロパティーは 2 つのグループに分けられます。最初のグループは、JNDI サービスプロバイダが Java SASL API (JSR 28) とやり取りする方法に関連するプロパティーで構成されます。これらのプロパティーには、接頭辞 "java.naming.security.sasl." が付きます。2 番目のグループは、SASL メカニズムに影響を与えるプロパティーで構成されます。これらのプロパティーは Java SASL API で指定され、接頭辞 "javax.security.sasl." が付きます。プロパティーのこの 2 番目のグループの詳細は、「SASL」および「Java SASL API」を参照してください。

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 で説明されている) RealmCallbackRealmChoiceCallback の要件を満たすデフォルトのコールバックハンドラを使用します。

たとえば、

env.put("java.naming.security.sasl.callback",
        new MyCallbackHandler());

これは、使用する SASL メカニズムのコールバックハンドラのインスタンスを提供します。


javax.security.sasl.qop

このプロパティーの値は、クライアントの保護の品質 (qop) 設定を指定するために使用される、qop 値の「,」で区切られたリストです。qop 値は、次のいずれかです。

リストの順序で、優先順位が決まります。このプロパティーが設定されない場合、デフォルトの qop 値は「auth」になります。
javax.security.sasl.strength

このプロパティーの値は、クライアントの設定を指定するために使用される、暗号強度値の「,」で区切られたリストです。強さを表す値は、次のいずれかです。

リストの順序で、優先順位が決まります。このプロパティーが設定されない場合、デフォルトの強さは「high,medium,low」になります。

DIGEST-MD5 でのプライバシの場合は、「high」「3des」に、「medium」「rc4」または「des」に、「low」「rc4-56」または「rc4-40」にマップされます。


javax.security.sasl.maxbuffer

このプロパティーの値は、クライアントが受信する受信バッファーの最大サイズをバイト数で指定した整数の、文字列表現です。このプロパティーが設定されない場合、デフォルトのサイズは SASL メカニズムで定義されます。


javax.security.sasl.server.authentication

このプロパティーの値は「true」または「false」のどちらかです。それぞれ、サーバーがクライアントに対して認証する必要の有無を指定します。このプロパティーが設定されない場合、デフォルトは「false」です。


javax.security.sasl.policy.forward

このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL メカニズムがセッション間の転送機密性をサポートするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。


javax.security.sasl.policy.credentials

このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL メカニズムがクライアントの資格を必要とするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。


javax.security.sasl.policy.noplaintext

このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL メカニズムを、単純で受動的な攻撃の影響を受けにくくするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。


javax.security.sasl.policy.noactive

このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL メカニズムを、能動的な (非ディクショナリ) 攻撃の影響を受けにくくするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。


javax.security.sasl.policy.nodictionary

このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL メカニズムを、ディクショナリ攻撃の影響を受けにくくするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。


javax.security.sasl.policy.noanonymous

このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL メカニズムが匿名のログインを許可するかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。

3.5 プロバイダ固有のプロパティー

プロバイダ固有のプロパティーは、特定のプロバイダ実装だけに適用される環境プロパティーです。これらのプロパティー名は、プロバイダの実装者により選択されます。これらのプロパティーの推奨される命名ポリシーは、実装者の逆にした DNS ドメイン名をプロバイダのパッケージ名の接頭辞として使用し、そのパッケージ名をプロパティー名の接頭辞として使用します。たとえば、Sun では、プロバイダ固有の LDAP プロパティーに「com.sun.jndi.ldap」の接頭辞を付けます。

4. 名前

名前は、プロバイダのコンテキストメソッドにより、次の規則に従って処理されます。
  1. コンテキストメソッドへのパラメータとして指定された String 名は、合成名の構文に従います。合成名の最初のコンポーネントが LDAP 識別名であるに対して、残りのコンポーネントは連合に使用されます。
  2. Name 引数が CompositeName オブジェクトである場合は、その最初のコンポーネントが LDAP 識別名であると見なされ、残りのコンポーネント (存在する場合) は連合に使用されます。
  3. Name 引数が CompositeName オブジェクトでない場合は、そのすべてのコンポーネントが LDAP 識別名の解析された形式であると見なされます。つまり、各 Name コンポーネントが LDAP 相対識別名 (RDN) です。
  4. 名前は、Context.getNameParser メソッドによって返された名前パーサーを使用して構文解析されます。このパーサーは、LDAP 識別名を String オブジェクトとして受け入れ、LDAP 識別名を Name オブジェクトとして生成します。
  5. コンテキスト操作により返される名前は、文字列合成名または文字列 URL です。
文字列 LDAP 識別名の構文は、RFC 2253 に従います。たとえば、

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.listContext.listBindingsDirContext.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 サーバーに接続します。


5. Attributes

LDAP プロバイダは、すべての属性値を入力では String または byte[] オブジェクトのどちらかとして予測し、出力でもこのどちらかとして返します。どの属性値が byte[] として処理されるか、およびそのリストを拡張する方法については、java.naming.ldap.attributes.binary 環境プロパティーを参照してください。


6. URL

RFC 2255 には、LDAP URL の構文形式が記載されています。この形式は、LDAP 検索操作の指定に必要なすべての要素を含み、拡張機能をサポートします。
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 のさまざまな個所で次のような役割を果たします。

  1. サービスプロバイダの構成。
    LDAP サービスプロバイダを構成するには、通常は java.naming.provider.url プロパティーに空白で区切られた 1 つ以上の LDAP または LDAPS URL を指定します。これは、LDAP サービスプロバイダがディレクトリサーバーへの接続設定を行う際に使用されます。この設定で関連するのは、URL の hostport、および dn の部分だけです。URL のその他の部分を指定すると、ConfigurationException がスローされます。
     
  2. 初期コンテキストメソッドへの引数。
    URL 文字列 (構文は scheme_id:rest_of_name) が InitialContext 内のメソッドに (String 引数または Name の最初のコンポーネントのどちらかとして) 渡された場合、URL のスキーム ID は、そのスキームを処理するためのコンテキストファクトリを見つけるために使用されます。何も見つからない場合、その URL 文字列は通常の名前として処理され、java.naming.factory.initial プロパティーで指定された初期コンテキストに渡されます。URL コンテキストファクトリを見つける方法については、java.naming.spi.NamingManager.getURLContext メソッドを参照してください。URL を名前としてサポートすることが可能なのは、初期コンテキスト内だけであることに留意してください。

    検索メソッドを除き、LDAP または LDAPS URL が名前として初期コンテキストに渡す場合、その URL にはどのようなクエリー (「?」) コンポーネントも含めません。違反すると、サービスプロバイダによって InvalidNameException がスローされます。検索メソッドの場合、URL のクエリーコンポーネントは引数として提供された対応するコンポーネントすべてより優先されます。たとえば、スコープコンポーネントを含む LDAP URL が指定されると、そのスコープは SearchControls 引数で渡されるスコープ設定より優先されます。
     

  3. 照会。
    LDAP 照会には、1 つ以上の URL のリストが含まれます。LDAP 照会を (java.naming.referral プロパティーを設定することによって明示的または暗黙的に) 処理するには、サービスプロバイダがこれらの URL 内の情報を使用して、参照先の LDAP サーバーへの接続を作成する必要があります。単一の照会内に複数の URL が存在する場合、これらは代替として扱われ、そのいずれかが成功するまで各 URL が処理されます。完全な URL (つまり、すべてのクエリーコンポーネントを含む) が使用されます。
     
  4. リストおよび検索列挙内の名前として返される。
    返されるエントリ名がターゲットコンテキストに対する相対名でない (つまり、リストまたは検索の起点となるコンテキストである) 場合、名前は URL として返されます。詳細は、NameClassPair.isRelative メソッドを参照してください。
     
  5. NamingManager または DirectoryManagergetObjectInstance メソッドへの引数。
    LDAP 名前空間が別の名前空間下 (DNS など) で連合する場合、上位の名前空間内に格納される情報は LDAP URL または LDAPS URL になります。このような場合、上位の名前空間内でのルックアップ/リスト/検索操作は、LDAP 名前空間に LDAP URL または LDAPS URL を含む Reference を返します。上位の名前空間のサービスプロバイダは、ReferencegetObjectInstance メソッドに渡して LDAP コンテキストのインスタンスを生成します。
項目 (1)、(2)、(3)、(5) の場合、URL にホスト名とポートが欠落し、空でない識別名が含まれている場合、インターネットドラフト draft-ietf-ldapext-locate-08.txt で説明しているように、プロバイダは DNS を使用して LDAP サービスを検出するためのアルゴリズムを使用する必要があります。プロバイダがこのアルゴリズムを使用しない場合、または DNS 設定が使用できない場合、プロバイダはホスト名に localhost を使用し、ポートにはプレーン接続の場合は 389 を、SSL 接続の場合は 636 を使用する必要があります。

7. Java オブジェクト

7.1 格納

LDAP プロバイダは、Java オブジェクトのディレクトリ内への格納をサポートする必要があります。これは、次のメソッド内で実装されています。 プロバイダは、少なくとも次のタイプの Java オブジェクトの格納をサポートする必要があります。
  1. Reference のインスタンス
  2. Referenceable インタフェースを実装するオブジェクト
  3. Serializable インタフェースを実装するオブジェクト
  4. DirContext インタフェースを実装するオブジェクト
クライアントの意図をもっとも正確に把握するために、オブジェクトがこれら 4 つのカテゴリに属するかどうかをリストされた順序でチェックする必要があります。たとえば、ReferenceSerializable であるため、最初に Serializable チェックを実行した場合は、Reference が参照形式で格納されることはなくなります (つまり、すべて直列化されます)。

Reference、Referenceable、および Serializable オブジェクトは、RFC 2713 に従って格納する必要があります。DirContext オブジェクトは、その属性を格納することによって格納されます。

RefAddr の参照のリストを javaReferenceAddress 属性に格納する場合、アドレスの位置、型、および内容を区切るために使用する区切り文字は、java.naming.ldap.ref.separator 環境プロパティーを使用して制御されます。この環境プロパティーが指定されない場合、区切り文字としてハッシュ文字「#」が使用されます。

プロバイダは、オブジェクトをディレクトリ内に格納するときに DirectoryManager.getStateToBind メソッドを使用します。これにより、どんな型のオブジェクトでも上記の 4 つのカテゴリの 1 つに変換して、ディレクトリ内に格納できるようになります。

7.2 読み取り

オブジェクトは、次のオペレーションを使ってディレクトリからの読み取りを実行します。 ディレクトリからエントリを読み取る場合、プロバイダは LDAP 属性と、そのエントリに Java オブジェクトが関連付けられている場合は RFC 2713 で定義されている属性を取得します。エントリに Java オブジェクトに関連した属性が含まれる場合、プロバイダはこれらの属性を使ってオブジェクトを再作成します。それ以外の場合、プロバイダは、そのエントリの属性を含む DirContext のインスタンスを返す必要があります。DirContext オブジェクトと Java オブジェクトのどちらの場合も、プロバイダは DirectoryManager.getObjectInstance() を呼び出し、その結果を呼び出し側に返します。

8. スキーマ

JNDI は、スキーマツリーの構造や内容、スキーマツリーの内容を変更する権限などのスキーマ関連の詳細を指定しません。スキーマツリーへの変更により受ける影響は、基盤となるディレクトリに依存します。JNDI が指定するのは、ルートスキーマコンテキスト (DirContext.getSchema() により返される) に次のバインディングが含まれることだけです。 このドキュメントでは、LDAP ベースのスキーマから派生するスキーマツリーの構造および内容の仕様を定めます。また、スキーマツリーの配置方法、およびこのスキーマツリーのさまざまな部分のエントリとの関連付けを期待できる必須およびオプションの属性について説明します。

スキーマツリーの内容を変更する権限は、ディレクトリ管理者により決定されます。スキーマツリーが変更されると、変更はディレクトリサーバーに格納されたスキーマに適用されます。

8.1 スキーマツリーの構造

前述のルートスキーマコンテキスト内の 3 つのバインディングに加え、ルートスキーマコンテキストに次の 4 つのバインディングを含めることもできます。
バインディング名 バインディングの説明
AttributeDefinition 属性定義ツリーのルート:名前または OID で識別される属性を持つ、フラットな名前空間
ClassDefinition 「objectclass」定義ツリーのルート:名前または OID で識別されるオブジェクトクラスを持つ、フラットな名前空間
SyntaxDefinition 構文定義ツリーのルート:OID で識別される構文を持つ、フラットな名前空間
MatchingRule 一致規則ツリーのルート:名前または OID で識別される一致規則を持つ、フラットな名前空間
ExtensionDefinition 拡張機能ツリーのルート:OID で識別される拡張機能を持つ、フラットな名前空間
ControlDefinition コントロールツリーのルート:OID で識別されるコントロールを持つ、フラットな名前空間
SASLMechanism SASL ツリーのルート:文字列名で識別される SASL 認証メカニズムを持つ、フラットな名前空間

基盤となるディレクトリがこの種のスキーマ情報を公開しない場合、またはサービスプロバイダがその取得をサポートしない場合には、これらのバインディングのいずれかまたはすべてが存在しないことがあり得ます。ただし、これらの名前がルートスキーマコンテキスト内に存在する場合には、上記の表に示したバインディングを保持する必要があります。

これらのエントリの属性の属性名と値では、大文字と小文字が区別されません。

8.2 属性定義

「AttributeDefinition」という名前は、スキーマ内の属性定義を表す DirContext オブジェクトを含むコンテキストにバインドされています。たとえば、ディレクトリが「commonName」属性をサポートする場合、「AttributeDefinition」コンテキストには、DirContext オブジェクトにバインドされている「commonName」という名前を持つバインディングが存在します。

「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();

8.3 オブジェクトクラス定義

「ClassDefinition」という名前は、スキーマ内のオブジェクトクラス定義を表す DirContext オブジェクトを含むコンテキストにバインドされています。たとえば、ディレクトリが「country」オブジェクトクラスをサポートする場合、「ClassDefinition」コンテキストには、DirContext オブジェクトにバインドされている「country」という名前を持つバインディングが存在します。

「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 の仕様には、サービスプロバイダはオブジェクトのオブジェクトクラス定義のいずれかを返すことになっています。オブジェクトは通常複数のオブジェクトクラスを保持すること、およびアプリケーションは実行中の動作に基づき、これらのオブジェクトクラスのいずれかに関する知識を必要とするため、この仕様は不適切です。上の例では、オブジェクトクラス定義をすべて含むコンテキストが返されます。

8.4 構文定義

「SyntaxDefinition」という名前は、スキーマ内の構文定義を表す DirContext オブジェクトを含むコンテキストにバインドされています。たとえば、ディレクトリが「1.3.6.1.4.1.1466.115.121.1.15」構文 (ディレクトリ文字列) の構文をサポートする場合、「SyntaxDefinition」コンテキストには、DirContext オブジェクトにバインドされている「1.3.6.1.4.1.1466.115.121.1.15」という名前を持つバインディングが存在します。

「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();

8.5 一致規則

「MatchingRule」という名前は、スキーマ内の一致規則を表す DirContext オブジェクトを含むコンテキストにバインドされています。「一致規則」は、属性値の比較で使用するアルゴリズムを一意に識別します。たとえば、ディレクトリは文字列の発音時の聞こえ方に基づく一致規則をサポートし、それを一致規則「soundAlikeMatch」として定義する場合があります。その場合、「MatchingRule」コンテキストには、DirContext オブジェクトにバインドされている「soundAlikeMatch」という名前を持つバインディングが存在します。

一致規則が拡張可能な規則の場合、「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

8.6 拡張機能定義

「ExtensionDefinition」という名前は、サーバーによってサポートされる拡張機能を表す DirContext オブジェクトを含むコンテキストにバインドされています。たとえば、ディレクトリが「Start TLS」拡張機能 (「1.3.6.1.4.1.1466.20037」) をサポートしているとします。その場合、「ExtensionDefinition」コンテキストには、DirContext オブジェクトにバインドされている「1.3.6.1.4.1.1466.20037」という名前を持つバインディングが存在します。

「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)

8.7 コントロール定義

「ControlDefinition」という名前は、サーバーによってサポートされるコントロールを表す DirContext オブジェクトを含むコンテキストにバインドされています。たとえば、ディレクトリは、サーバーが返す検索結果をソートするようサーバーに依頼するためのコントロールをサポートする場合があります。

「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

8.8 SASL メカニズム

「SASLMechanism」という名前は、サーバーによってサポートされる SASL 認証メカニズムを表す DirContext オブジェクトを含むコンテキストにバインドされています。たとえば、ディレクトリは、サーバーが低位層によって交換されるセキュリティーの資格を使用することを要求する EXTERNAL SASL メカニズム (RFC 2222) をサポートする場合があります。

「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)

9. 例外

LDAP プロバイダを構築する場合は、LDAP エラーコード (RFC 2251 を参照) を JNDI 例外に変換する必要があります。翻訳の実行時には、次の表を使用してください。また、エラーに関する可能なかぎり多くの情報を、例外の詳細なメッセージ、「根本原因」例外、解決済みの名前および残りの名前内にエンコードして入れてください。解決済みの名前と解決済みのオブジェクトは、相互の設定値に対応していなければなりません。
 
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.referralignore に設定されているか、またはエラーの内容に照会が含まれていない場合は、PartialResultException をスローします。それ以外の場合、その内容を使用して照会を構築します。
referral (10) java.naming.referralignore に設定されている場合は、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

10. API マッピング

JNDI API コンテキストインタフェースのメソッドは、次のように LDAP 操作にマップされます。
 
EventContext.addNamingListener
EventDirContext.addNamingListener
LDAP エントリの指定されたサブツリー内で発生する命名イベントを受け取るリスナーを登録します。LDAP サーバーは、LDAP 操作応答に接続された LDAP コントロール、または LDAP 非要請通知により、クライアントに対してイベントを通知します。次に、このような応答が LDAP プロバイダによって処理されたあと、NamingEvent または UnsolicitedNotificationEvent の形式でアプリケーションに示されます。
Context.addToEnvironment

コンテキストの環境プロパティーを更新します。複数のコンテキストが同じ環境プロパティーのセットを共有する場合、プロバイダは目的のコンテキストの環境だけを修正するよう注意する必要があります。環境プロパティーを変更すると、コンテキストが使用している既存の接続も変更しなければならない場合があります。

プロパティー値に null を指定すると、そのプロパティーを削除するのと同じ効果が得られます。
どんな環境プロパティーの場合でも、新たなプロパティーは、たとえそれがコンテキストに影響を与えない場合でも、記録されます。「環境プロパティー」を参照してください。
Context.bind

DirContext.bind
LDAP 追加操作を実行して、ディレクトリ内にエントリを新規作成します。DirContext.bind メソッドは、null 以外の属性セットも指定されていれば、バインド対象のオブジェクトとして null を受け入れることができます。そうしないと、メソッドに十分な情報 (つまり、オブジェクトや属性) が指定されない場合に、エントリは追加されません。引数にオブジェクトが指定されている場合は、「Java オブジェクト」で説明しているように、そのオブジェクトが属性に変換され、指定されているすべての属性とともにエントリ内に格納されます。プロバイダは、DirectoryManager.getStateToBind メソッドを使用して、入力オブジェクトを格納可能な形式に変換する必要があります。
プロバイダがディレクトリ内のいずれかのオブジェクトのバインディングをサポートしていない場合は、OperationNotSupportedException をスローする必要があります。そうしないと、プロバイダがオブジェクトのバインディングをサポートしても提供されたオブジェクトをサポートしない場合、プロバイダは IllegalArgumentException をスローする必要があります。
Context.close
コンテキストに割り当てられたリソースを解放します。たとえば、このコンテキストに使用される接続が別のコンテキストに共有されていない場合は、プロバイダは未処理の要求を破棄してサーバーへのネットワーク接続を閉じることができます。どのリソースが解放されるかは、厳密には実装に依存しています。
Context.composeName
親コンテキストが同一の LDAP 名前空間に由来している場合、Context.getNameParser() で説明した LDAP 名前構文に従って名前を連結します。それ以外の場合、名前を合成名として連結します。
Context.createSubcontext

DirContext.createSubcontext
LDAP 追加操作を実行して、指定されたエントリとそれに関連付けられた属性を作成します。属性が指定されていない場合は、topjavaContainer の値を使用して objectClass 属性が生成されます (javaContainer は、スキーマ違反エラーを回避するために必要な構造化クラスです)。
Context.destroySubcontext
LDAP 削除操作を実行して、指定されたエントリとそれに関連付けられた属性を削除します。指定されたエントリは、リーフエントリである必要があります。サブツリーは削除されません。リーフエントリが存在しない (ただし親は存在する) 場合には、操作は成功します。
LdapContext.extendedOperation
LDAP 拡張操作を実行します。
DirContext.getAttributes
LDAP 基底オブジェクトの検索操作を実行し、LDAP エントリの属性を取得します。フィルタとして「(objectclass=*)」を使用してください。
要求された属性のリストが null であるか、または特別な属性識別子「*」を含む場合、LDAP エントリのユーザー属性すべてが返されます。操作属性が必要な場合は、これらの属性識別子が、要求された属性のリスト内に存在する必要があります。
LdapContext.getConnectControls
このコンテキストに対して呼び出される LDAP バインド操作用の、有効な接続要求コントロールを取得します。
Context.getEnvironment
このコンテキストで記録された環境プロパティーを返します。
Context.getNameInNamespace
このコンテキストの LDAP 識別名を返します。
Context.getNameParser
RFC 2253 に従って LDAP 名を構文解析する名前パーサーを返します。
LdapContext.getRequestControls
このコンテキストに対してその後呼び出される LDAP 操作用の、有効な要求コントロールを取得します。
LdapContext.getResponseControls
このコンテキストに対して呼び出される最後の LDAP 操作が返す応答コントロールを取得します。
DirContext.getSchema
スキーマのセクションを参照してください。
DirContext.getSchemaClassDefinition
スキーマのセクションを参照してください。
Context.list
フィルタ「(objectclass=*)」を使用して、指定されたエントリの LDAP 単一レベル検索操作を実行することにより、指定されたエントリの直下にあるエントリの名前を取得します。
各エントリのクラス名を判定できるように、少なくとも、javaClassName 属性を問い合わせます。クラス名を判定できない場合は、クラス名として javax.naming.directory.DirContext を返します。
返される名前は、名前付きコンテキストに対する相対的な名前、または LDAP URL か LDAPS URL です。
Context.listBindings
フィルタ「(objectclass=*)」を使って指定されたエントリの LDAP 単一レベル検索操作を実行し、オブジェクト (またはオブジェクト参照) を表す属性を取得します。Java オブジェクトを再構築するために必要な属性を (および多くの場合その他の属性も) 要求します。オブジェクトの再構築方法については、「Java オブジェクト」を参照してください。オブジェクトを RFC 2713 に従って再構築できない場合、LDAP エントリを表す DirContext オブジェクトを返します。プロバイダは、DirectoryManager.getObjectInstance メソッドを使用して、Binding.getObject メソッドへの呼び出し要件を満たす必要があります。
返される名前は、名前付きコンテキストに対する相対的な名前、または LDAP URL か LDAPS URL です。
Context.lookup

Context.lookupLink
フィルタ「(objectclass=*)」を使って、指定されたエントリの LDAP 基底オブジェクト検索操作を実行します。Java オブジェクトを再構築するために必要な属性 (おそらくすべて) を要求します。オブジェクトの再構築方法については、「Java オブジェクト」を参照してください。プロバイダは、DirectoryManager.getObjectInstance メソッドを使用して、Binding.getObject メソッドの呼び出し要件を満たす必要があります。
DirContext.modifyAttributes
提供された変更を使用して、指定されたエントリで LDAP 変更操作を実行します。Attributes を受け入れるオーバーロードされたメソッドの場合は、まず Attributes.getAll() を使用してその内容を列挙し、変更操作の引数 (mod_op) を再利用することによって、Attributes 引数を変更の順序付けられたリストに変換します。
LdapContext.newInstance
このコンテキストの新規インスタンスを、指定された要求コントロールを使って初期化します。
Context.rebind

DirContext.rebind
このメソッドには、いくつかの異なる LDAP 操作を含めることができます。まず、既存のエントリの属性を取得します。既存のエントリが存在しない場合、このメソッドは bind() と同じ動作を行います。それ以外の場合、属性が指定されておらず、バインドされるオブジェクトが DirContext である場合は、DirContext.getAttributes() を呼び出し、その結果を属性引数 (attrs) として使用します。それでも属性が存在しない場合は、元のエントリの属性を attrs として使用します。LDAP 削除操作を実行して、既存のエントリを削除します。引数に指定されているオブジェクトを (「Java オブジェクト」の説明に従って) 属性に変換し、LDAP 追加操作を使用して attrs とともにエントリ内に格納します。プロバイダは、DirectoryManager.getStateToBind メソッドを使用して、入力オブジェクトを格納可能な形式に変換する必要があります。
LdapContext.reconnect
提供された接続要求コントロールおよび現在の環境プロパティーを使って LDAP サーバーへ再接続します。
Context.removeFromEnvironment

コンテキストの環境プロパティーを削除します。複数のコンテキストが同じ環境プロパティーのセットを共有する場合、プロバイダは目的のコンテキストの環境だけを修正するよう注意する必要があります。環境プロパティーを変更すると、コンテキストが使用している既存の接続も変更しなければならない場合があります。

どんな環境プロパティーの場合でも、新たなプロパティーは、たとえそれがコンテキストに影響を与えない場合でも、記録されます。プロパティーを削除すると、コンテキストはプロパティーのデフォルトが設定されているとみなします。
EventContext.removeNamingListener
命名イベントリスナーの登録解除を行い、そのリスナーを対象とするイベントがその後送信されないようにします。
Context.rename
LDAP 変更 DN 操作を実行して、エントリの名前を変更します。LDAPv2 が使用される場合、新たな名前および以前の名前は同じ直系の親の名前を共有する必要があります。親が等しくない場合は、InvalidNameException がスローされます。
java.naming.ldap.deleteRDN プロパティーがこのメソッドの動作に与える影響に注意してください。
DirContext.search
指定された検索コントロールに従って、LDAP 検索操作を実行します。
要求された属性のリストが null であるか、または特別な属性識別子「*」を含む場合、LDAP エントリのユーザー属性すべてが返されます。操作属性が必要な場合、要求される属性リスト内にこれらの属性識別子が存在していなければなりません。
オブジェクトを返すように要求されている場合、API ユーザーからの要求事項に加えて、Java オブジェクト関連の属性 (RFC 2713) も要求されます。これらの属性が存在する場合は、それを使用して元のオブジェクトが組み立てられます (「Java オブジェクト」を参照)。オブジェクトを RFC 2713 に従って再構築できない場合、LDAP エントリを表す DirContext オブジェクトを返します。プロバイダは、DirectoryManager.getObjectInstance メソッドを使用して、Binding.getObject メソッドへの呼び出し要件を満たす必要があります。
返される名前は、指定されたコンテキストを基準にしているか、または LDAP か LDAPS URL です。
指定された検索フィルタが適切に制約されている場合、プロバイダは、LDAP 検索の代わりに LDAP 比較操作を使用できます。
 
  • フィルタは、「(<attributeID>=<value>)」の形式である必要があります。
  • スコープは、オブジェクトスコープである必要があります。
  • ゼロ属性 (空の戻り属性リスト) を要求する必要があります。

引数として文字列フィルタを受け入れる検索の形式では、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 内のオブジェクトは、次の方法でエンコードする必要があります。
 

  • バイト配列 (byte[]) のエンコードは、各バイトを RFC 2254 に従った文字列としてエンコードすることによって行われます。たとえば、配列 {0, 1, 10, 100} は、文字列「\\00\\01\\0a\\64」としてエンコードされます。
  • 文字列はリテラルとして処理されます。つまり、文字列内に現れる「*」や RFC 2254 で定義されているその他の特殊文字は、RFC 2254 の規則に従ってエスケープされます。たとえば、「*」の文字列は文字列「\\2a」としてエンコードされます。
  • String でも byte[] でもないオブジェクトは、Object.toString() を使用してそれぞれの文字列形式に変換されたあと、String の規則が適用されます。
LdapContext.setRequestControls
このコンテキストで引き続き呼び出される LDAP 操作のための要求コントロールを設定します。
EventContext.targetMustExist
リスナーが、存在しない LDAP エントリへの関係を登録できるかどうかを判断します。
Context.unbind
LDAP 削除操作を実行して、指定されたエントリを削除します。指定されたエントリは、リーフエントリである必要があります。サブツリーは削除されません。リーフエントリが存在しない (ただし親は存在する) 場合には、操作は成功します。

11. 連合

LDAP サービスプロバイダは、強分類、および接続と暗黙の次のネーミングシステムポインタのどちらかまたは両方を使って連合をサポートする必要があります。

12. SASL

このプロバイダは、Java SASL API (JSR 28) による SASL メカニズムをサポートします。これにより、異なるベンダーから提供される SASL メカニズムドライバを LDAP プロバイダで使用できるようになります。また、SASL メカニズムドライバをさまざまな LDAP プロバイダおよび非 LDAP プロトコルライブラリで使用することもできます。

Java SASL API は、Java Authentication and Authorization Service (JAAS) に依存しています。JAAS は、ユーザー/アプリケーション情報を直接取得または提供する必要のある SASL メカニズムのコールバックサポートを提供します。

12.1 SASL 構成

SASL 認証を使用することを指定するには、SASL メカニズムの IANA に登録された正式な名前を java.naming.security.authentication プロパティーに指定します。利用可能かつオプションで指定されたポリシーを満たすリスト上の最初の SASL メカニズムが使用されます。つまり、接頭辞 "javax.security.sasl.policy." の付いたプロパティーを使用して、選択された SASL メカニズムのセキュリティーの特性を制御できます。

SASL メカニズムの中には、認証されるエンティティーの識別情報を要求するものもあります。これは、認証 ID と呼ばれます。SASL メカニズムによっては、CRAM-MD5 や 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」を参照してください。

12.2 SASL メカニズムのドライバ

Java SASL API は、SASL メカニズムドライバへの動的なプラグインを実現するフレームワークを提供しています。LDAP プロバイダは、いくつかのデフォルトドライバを提供可能です。詳細は、「Java SASL API」を参照してください。

13. 拡張機能およびコントロール

このプロバイダは、javax.naming.ldap パッケージを使用して LDAP 拡張機能およびコントロールをサポートします。さらに、このプロバイダは、javax.naming.event パッケージのサービスを使用して (LDAP 拡張操作応答で転送される) LDAP 非要請通知をサポートします。

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 で推奨されているように、プロバイダは識別名から派生されたドメイン名をホスト名として使用して検証するべきです。


14. イベント通知

このプロバイダは、javax.naming.event パッケージを使用してイベント通知をサポートします。

JNDI アプリケーションは、ディレクトリ内で発生するイベント (エントリの追加または削除、エントリの変更など) を登録できます。アプリケーションはまた、非要請通知も登録できます。



15. SSL

このプロバイダは、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.authenticationjava.naming.security.principal、および java.naming.security.credentials 環境プロパティーを設定する必要があります。LDAP 認証が必要であり、かつ SSL 資格を LDAP 認証に再利用する必要がある場合は、次のように、SASL EXTERNAL メカニズムを選択するように java.naming.security.authentication 環境プロパティーを設定します。

        env.put(Context.SECURITY_AUTHENTICATION, "EXTERNAL");
 


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.