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

Draft 0.4.2


コメントの送付先: jndi@java.sun.com

目次
 
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 のドキュメントに指定されているように初期化することができます。

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

コントロール、オブジェクトおよび状態ファクトリプロパティーの場合、プロパティーの複数回の出現が配置されていると、その値は連結されて単一のリストになります。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 メソッドの呼び出し時に、変更を確認したり有効にしたりする必要はありません。そのプロパティーを使用する操作が次に呼び出されたときに、変更が有効になります。

3.1.5 デフォルト

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

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

3.1.6 設定可能な値

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

3.2 JNDI プロパティー

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

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

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

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

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

次に例を示します。

env.put(Context.BATCHSIZE, "24");
これは、サーバーから 24 エントリが読み取られるか、列挙が終了するまで、プロバイダがブロックすることを意味します。どちらの場合にも、生成される結果の数はより小さい値になります。
java.naming.factory.control
このプロパティーの値は、コントロールファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。

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

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

次に例を示します。

env.put(LdapContext.CONTROL_FACTORIES,
        "com.sun.jndi.ldap.ctl.ResponseControlFactory");
これは、ResponseControlFactory クラスを、試行対象のコントロールファクトリとして設定します。
java.naming.factory.initial
このプロパティーの値は、LDAP サービスプロバイダの初期コンテキストを作成するファクトリクラスの完全修飾されたクラス名です。

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

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

次に例を示します。

env.put(Context.INITIAL_CONTEXT_FACTORY,
       "com.sun.jndi.ldap.LdapCtxFactory");
これは、Sun の LDAP プロバイダを選択します。
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 サーバーのホスト名とポートを判断する必要があります。 接続の確立に成功した場合、java.naming.provider.url プロパティーを接続に成功したホスト名、ポート、識別名を使用して構築された 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 サーバーは、単に照会を無視して要求を通常に処理します。

単一の照会エントリ内で検出される複数の 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 になります。 java.naming.security.credentials プロパティーが設定された場合のデフォルト値は 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 ソケットを使用する必要があります。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 固有のプロパティーを示します。このリストに属すると思われるプロパティーがあれば、jndi@java.sun.com までお知らせください。

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-2713
userCertificate 2.5.4.36 RFC-2713
cACertificate 2.5.4.37 RFC-2713
authorityRevocationList 2.5.4.38 RFC-2713
certificateRevocationList 2.5.4.39 RFC-2713
crossCertificatePair 2.5.4.40 RFC-2713
x500UniqueIdentifier 2.5.4.45 RFC-2713

例を示します。
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 インタフェースを実装する必要があります。詳細については、http://java.sun.com/j2se/1.4/ja/docs/ja/guide/security/jsse/JSSERefGuide.html を参照してください。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 進数の文字列です。値がゼロの場合、無制限であることを示します。

このプロパティーが設定されない場合、デフォルト値は 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 プロパティーの値を使って、RealmCallback および RealmChoiceCallback (Java SASL API を参照) の要件を満たします。

例を示します。

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 内での機密性については、high3des へ、mediumrc4 または des へ、lowrc4-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 名は、複合名構文内にあります。
  2. 複合名の最初のコンポーネントは LDAP 識別名であるのに対し、他のコンポーネントは連合で使用されます。
  3. Name 引数が CompositeName オブジェクトである場合、その最初のコンポーネントが LDAP 識別名であるとみなされ、残りのコンポーネント (存在する場合) が連合で使用されます。
  4. Name 引数が CompositeName オブジェクトではない場合、そのコンポーネントすべてが LDAP 識別名の構文解析された形式であるとみなされます。つまり、各 Name コンポーネントは LDAP 関連の識別名 (RDN) です。
  5. 名前は、Context.getNameParser メソッドが返す名前パーサーを使って構文解析されます。名前パーサーは、LDAP 識別名を String オブジェクトとして受け取り、LDAP 識別名を Name オブジェクトとして生成します。
  6. コンテキスト操作により返される名前は、文字列複合名または文字列 URL です。
文字列 LDAP 識別名の構文は、RFC 2253 に準拠しています。例を示します。
  • CN=Steve Kille, O=Isode Limited, C=GB
  • OU=Sales+CN=J. Smith, O=Widget Inc., C=US
  • CN=L. Eagle, O=Sue\, Grabbit and Runn, C=GB
  • 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 文字列が返されます。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[] オブジェクトとして入力されるものとみなし、すべての属性値を String または byte[] オブジェクトとして返します。どの属性値が byte[] とみなされるのか、およびそのリストの拡張方法については、java.naming.ldap.attributes.binary 環境プロパティーを参照してください。


    6. URL

    LDAP URL の構文形式については、RFC 2255 を参照してください。この形式は、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. サービスプロバイダの構成

    2. LDAP サービスプロバイダを構成するには、通常、java.naming.provider.url プロパティー内で LDAP URL または LDAPS URL を指定します。 複数の URL を指定する場合はスペースで区切ります。これは、LDAP サービスプロバイダがディレクトリサーバーへの接続設定を行う際に使用されます。この設定と関係があるのは、URL の hostport、および dn 部だけです。URL の他の部分を指定すると、ConfigurationException がスローされます。
       
    3. 初期コンテキストメソッドへの引数

    4. URL 文字列 (scheme_id:rest_of_name 構文) が InitialContext 内のメソッドへ String 引数または Name の最初のコンポーネントとして渡されると、スキーマを処理するコンテキストファクトリの検出が URL のスキーマ ID を使って行われます。何も検出されない場合、URL 文字列は通常名として処理され、java.naming.factory.initial プロパティーにより指定された初期コンテキストに渡されます。URL コンテキストファクトリの検出方法についての詳細は、java.naming.spi.NamingManager.getURLContext メソッドを参照してください。URL を名前としてサポートすることが可能なのは、初期コンテキスト内だけであることに留意してください。

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

    5. 照会

    6. LDAP 照会には、1 つ以上の URL のリストが含まれます。LDAP 照会を (java.naming.referral プロパティーを設定することにより明示的または暗黙的に) 処理するには、サービスプロバイダがこれらの URL 内の情報を使用して参照先の LDAP サーバーへの接続を作成する必要があります。単一の照会内に複数の URL が存在する場合、これらは代替として扱われ、そのいずれかが成功するまで各 URL が処理されます。完全な URL (つまり、すべてのクエリーコンポーネントを含む) が使用されます。
       
    7. リストおよび検索列挙内に名前として返される

    8. 返されるエントリ名がターゲットコンテキストに対する相対名でない (つまり、リストまたは検索の起点となるコンテキストである) 場合、名前は URL として返されます。詳細は、NameClassPair.isRelative を参照してください。
       
    9. NamingManager または DirectoryManagergetObjectInstance メソッドへの引数

    10. 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 も参照形式で格納されることはありません (つまり、すべて直列化されます)。

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

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

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

    7.2 読み込み

    オブジェクトは、次のオペレーションを使ってディレクトリからの読み込みを実行します。 プロバイダは、ディレクトリからのエントリの読み込み時に、LDAP 属性、および RFC 2713 に定義された属性 (エントリが関連付けられた Java オブジェクトを保持する場合) を取得します。エントリに 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 で定義された名前と一対一で対応します。属性値すべては、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 で定義された名前と一対一で対応します。属性値すべては、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");

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

    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 で定義された名前と一対一で対応します。属性値すべては、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」に対して RFC2252 で定義された名前と一対一で対応します。属性値すべては、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. Exceptions

    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 追加操作を実行して、名前付きエントリおよびその関連付けられた属性を作成します。属性が提供されない場合、objectClass 属性が値 top および javaContainer (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 URL か 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 認証を指定するには、IANA に登録された公式の SASL 機構名を 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」という概念をサポートしています。認証 ID は、認証の成功時にサーバーがアクセスを許可する対象となるエンティティーです。 java.naming.security.sasl.authorizationId プロパティーが設定されている場合には、この値が認証 ID として使用されます。 設定されていない場合は空の文字列が認証 ID として使用されます。これによって、サーバーはクライアントの認証資格から認証 ID を作成します。

    LDAP サービスプロバイダが SASL のサポートで使用するプロパティーの詳細については、「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 ネゴシエーションの後で、ホスト名の検証を実行する必要があります。 「URL」内で説明する) DNS の情報を使用して自動的に LDAP サーバーが検出された場合、draft-ietf-ldapext-locate-08.txt の推奨に従って、プロバイダは識別名から検証対象のホスト名として抽出されたドメイン名を使用する必要があります。


    14. イベントの通知

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

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



    15. SSL

    プロバイダは Java Secure Socket Extension (JSSE) 仕様に従って SSL をサポートします。java.naming.security.protocol 環境プロパティーを次のように設定することにより、SSL が起動します。
    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 認証で再利用する必要がある場合には、次のように java.naming.security.authentication 環境プロパティーを設定して SASL EXTERNAL 機構を選択します。

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



    Copyright © 2002 Sun Microsystems, Inc. All rights reserved.