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

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

none
認証を使用しません(匿名バインド)。
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. 属性

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メカニズムによっては、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, 2020, Oracle and/or its affiliates. All rights reserved.