LDAP ネームサービスプロバイダ
Java Naming and Directory InterfaceTM (JNDI)


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

目次

  1. はじめに
  2. 適合性
  3. 環境プロパティ
  4. 名前
  5. 属性
  6. URL
  7. Java オブジェクト
  8. スキーマ
  9. 例外
  10. API マッピング
  11. 連合
  12. イベントの通知
  13. SASL 認証
  14. SSL および Start TLS
  15. 接続プール
  16. セキュリティについて



1. はじめに

Lightweight Directory Access Protocol (LDAP) は、ディレクトリサービスにアクセスするときのインターネット標準です。JNDI/LDAP サービスプロバイダを使用して、LDAP のプロトコルが実装されているサーバにアクセスすることができます。

このドキュメントでは、LDAP サービスプロバイダの機能について説明します。主に、LDAP サービスプロバイダの動作を中心に説明します。詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。例および使用方法については、JNDI チュートリアルを参照してください。

LDAP サービスプロバイダには、LDAP アクセスの基本機能が実装されます。汎用的な LDAP コントロール、RMI オブジェクトと CORBA オブジェクトの格納および読み込みに対するサポートなどを基本プロバイダに追加する場合は、「ブースターパック」をインストールしてください。「ブースターパック」は、JNDI の Web サイトからダウンロードできます。


2. 適合性

LDAP サービスプロバイダは、次の標準に準拠しています。
 
標準 サポート 備考
LDAPv3 (RFC 2251) はい  
LDAPv3 属性 (RFC 2252) はい  
LDAPv3 識別名 (RFC 2253) はい  
LDAP 検索フィルタ (RFC 2254) はい  
LDAP URL 形式 (RFC 2255) はい  
LDAPv3 スキーマ (RFC 2256) はい  
LDAPv2 (RFC 1777) はい  
LDAP 認証 (RFC 2829) はい  
Start TLS 拡張機能 (RFC 2830) はい  
DIGEST-MD5 (RFC 2831) はい  
Manage Referral Control (参照コントロール) (RFC 3296) はい  
Paged Results Control (ページング結果コントロール) (RFC 2696) はい  
Sort Control (ソートコントロール) (RFC 2891) はい  


3. 環境プロパティ

JNDI、LDAP 固有、および SASL 固有のプロパティについての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。

3.1 JNDI プロパティ

LDAP サービスプロバイダでは、次の JNDI 環境プロパティがサポートされます。
 
プロパティ サポート 備考
java.naming.batchsize はい デフォルト値は 1
java.naming.factory.control はい  
java.naming.factory.initial はい LDAP サービスプロバイダを初期コンテキストとして使用するときは、com.sun.jndi.ldap.LdapCtxFactory を指定する
java.naming.factory.object はい  
java.naming.factory.state はい  
java.naming.language いいえ 無視される
java.naming.provider.url はい Java 2 SDK、v 1.4.1 以前のシステムでは、単一の URL のみ含まれる。Java 2 SDK、v 1.4.2 は LDAPS URL を格納できない
java.naming.referral はい  
java.naming.security.authentication はい simplenone、SASL 機構のリスト
java.naming.security.credentials はい  
java.naming.security.principal はい  
java.naming.security.protocol はい ssl

3.2 LDAP 固有のプロパティ

LDAP サービスプロバイダでは、次の LDAP 固有の環境プロパティがサポートされます。
 
プロパティ サポート 備考
java.naming.ldap.attributes.binary はい  
java.naming.ldap.control.connect はい  
java.naming.ldap.deleteRDN はい  
java.naming.ldap.derefAliases はい  
java.naming.ldap.factory.socket はい java.naming.security.protocol プロパティに ssl が設定されているときは、デフォルト値は javax.net.ssl.SSLSocketFactory。詳細は、「SSL」を参照
java.naming.ldap.ref.separator はい  
java.naming.ldap.referral.limit はい  
java.naming.ldap.typesOnly はい  
java.naming.ldap.version はい  

3.3 SASL 固有のプロパティ

このサービスプロバイダでは、次の SASL 固有の環境プロパティがサポートされます。
 
プロパティ サポート 備考
java.naming.security.sasl.authorizationId はい  
java.naming.security.sasl.callback はい  
java.naming.security.sasl.realm はい  
javax.security.sasl.qop はい  
javax.security.sasl.strength はい Java プラットフォームの Java 暗号化拡張機能 (JCE) サービスプロバイダで利用できる暗号に基づいて選択された暗号
javax.security.sasl.maxbuffer はい  
javax.security.sasl.server.authentication はい  
javax.security.sasl.policy.forward はい  
javax.security.sasl.policy.credentials はい  
javax.security.sasl.policy.noplaintext はい  
javax.security.sasl.policy.noactive はい  
javax.security.sasl.policy.nodictionary はい  
javax.security.sasl.policy.noanonymous はい  

3.4 プロバイダ固有のプロパティ

LDAP サービスプロバイダは、次のプロバイダ固有の環境プロパティを定義しています。
 
com.sun.jndi.ldap.connect.pool
このプロパティを使用して、初期コンテキストインスタンスを作成するときに、プールされた接続を使用する必要があることを指定します。この値が「true」の場合、接続を作成するためのパラメータ (connection request と呼ばれる) が、接続プール設定で規定される基準に一致すれば、プロバイダはプールされた接続を使用します。このプロパティが設定されていない場合、または他の値に設定されている場合、あるいは接続要求が基準に一致しない場合、プロバイダはプールされた接続を使用しません。接続プールの詳細は、「接続プール」を参照してください。

次に例を示します。

env.put("com.sun.jndi.ldap.connect.pool", "true");
LDAP プロバイダに、初期コンテキストの作成時にプールされた接続を使用するように指示します。

注 - Java 2 SDK、v 1.4.1 以前のシステムでは、接続プールはサポートされていません。このため、このプロパティは無視されます。

com.sun.jndi.ldap.connect.timeout
このプロパティの値は、接続タイムアウトのミリ秒数を示す整数を文字列で表現したものです。LDAP プロバイダがこの値の期間中に接続を確立できないと、接続の試行は中止されます。整数は 0 より大きい必要があります。0 以下の整数を指定した場合は、TCP などのネットワークプロトコルのタイムアウト値が使用されます。

このプロパティが指定されない場合は、接続が確立されるのを待機するか、または基本となるネットワークのタイムアウトまで待機します。

次に例を示します。

env.put("com.sun.jndi.ldap.connect.timeout", "500");
0.5 秒以内に接続が確立されない場合、LDAP サービスプロバイダによる接続試行が中止されます。

接続のために接続プールが要求されている場合、プール内のすべての接続が使用され、かつ最大プールサイズに到達しているときの、接続の最大待機時間がこのプロパティにより決定されます。このような状況下で、このプロパティの値がゼロ以下に設定されている場合、プロバイダは接続が可能になるまで無限に待機することになります。それ以外の値に設定されている場合は、プロバイダは最大待機時間を超えた時点で、待機を中断します。詳細は、「接続プール」を参照してください。

注 - Java 2 SDK の v 1.4 より前のシステムでは、接続タイムアウトが SDK でサポートされないため、このプロパティは無視されます。

com.sun.jndi.ldap.netscape.schemaBugs
Netscape Directory Server 4.0 以前のリリースでは、RFC 2252 に準拠しているスキーマエントリはサポートされていません。特に、Netscape サーバでは RFC 2252 と異なり、OID (SUP および SYNTAX の OID など) は単一引用符で区切り、MUST/MAY リストは括弧で囲む必要があります。Netscape Directory Server 4.0 のスキーマを更新するときは、この問題に対処するために、この com.sun.jndi.ldap.netscape.schemaBugs プロパティを使用する必要があります。

次の値は、このプロパティ用に定義されたものです。

        true
           回避策を有効にする
       false
           回避策を無効にする

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

次に例を示します。

env.put("com.sun.jndi.ldap.netscape.schemaBugs", "true");
この場合は、回避策が有効になります。

注 1: このプロパティは、初期コンテキストにだけ渡され、そのプロバイダで固定されます。addToEnvironment または removeFromEnvironment メソッドには影響されません。

注 2: Netscape Directory Server 4.1 を使用している場合、このプロパティを使用してはなりません。4.1 サーバでは、括弧の付かない MUST/MAY 句を含むオブジェクトクラス定義を構文解析する際に問題が発生します。単一の MUST/MAY 項目を含むオブジェクトクラス定義を作成または変更する場合、MUST/MAY リストに余分の値 (objectClass など) を追加することにより、このバグを回避してください。

com.sun.jndi.ldap.trace.ber
このプロパティの値は、java.io.OutputStream オブジェクトです。このオブジェクトに対して、LDAP ASN.1 BER の送受信パケットの 16 進ダンプが書き込まれます。

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

次に例を示します。

env.put("com.sun.jndi.ldap.trace.ber", System.out);
この場合、LDAP プロトコルトレースは標準の出力ストリームに書き込まれます。

注 - このプロパティは、初期コンテキストにだけ渡され、そのプロバイダで固定されます。addToEnvironment または removeFromEnvironment メソッドには影響されません。


4. 名前

LDAP サービスプロバイダの名前についての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。 次の形式の LDAP 識別名がサポートされています。
 
識別名の形式 備考
String 複合名と見なされる。複合名の最初のコンポーネントは、識別名として処理される。残りのコンポーネントは連合される
名前 CompositeName のインスタンスの場合は、複合名と見なされる。つまり、最初の複合名のコンポーネントは、識別名として処理され、残りのコンポーネントは連合される。CompositeName のインスタンスでない場合は、解析済みの LDAP 名と見なされる。この場合、Name の各コンポーネントは、RFC 2253 に定義されている LDAP 名のコンポーネントとなる
LDAP URL 文字列 LDAP URL 文字列が初期コンテキストに渡されると、RFC 2255 に基づいて解釈され、その識別名コンポーネントは RFC 2253 に基づいて解釈される
LDAPS URL 文字列 LDAPS URL 文字列は、初期コンテキストに渡されると、サーバとの通信に SSL 接続が使用される点を除き、LDAP URL と同じように解釈される

注 - Java 2 SDK、v. 1.4.2 より前のシステムでは、LDAP サービスプロバイダは LDAPS URL を認識しない

getNameParser() 呼び出しから返された名前パーサによってパーサが返されます。このパーサは、文字列名を受け取ると RFC 2253 に基づいて文字列名を解析し、コンポーネントに渡します。


5. 属性

LDAP サービスプロバイダの属性について詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。 LDAP サービスプロバイダでは、属性値を指定するときに次の形式が使用されます。
 
属性値の形式 サポート 備考
String はい  
byte[] はい  

一部の LDAP サーバでは、属性値に対して言語の優先順位を指定するときに、属性の部分型、属性名の類語、および言語コードを使用することができます。この場合、LDAP サーバから返された属性名は、要求した属性名と異なることがあります。

LDAP では、属性名の大文字と小文字が区別されます。このため、パラメータとして JNDI 操作に渡す属性のまとまりを作成するときは、大文字と小文字が区別される属性クラスを使用することをお勧めします。次に例を示します。

        Attributes attrs = new BasicAttributes(true); // ignoreCase=true

属性値を使用するときは、String および byte[] のどちらの場合も、その属性値の構文と形式の情報が必要です。属性値の構文と形式は、これらの情報が定義されているスキーマドキュメントで確認できます。

属性を JNDI 呼び出しに引数として渡すときは、その属性は LDAP ディレクトリに適用されているすべてのスキーマに準拠していなければなりません。特に、新しい LDAP を作成するときは (Context.bindContext.rebind、または DirContext.createSubcontext を使用するときなど)、通常 objectClass 属性が必要です。


6. URL

6.1 使用法

LDAP サービスプロバイダの URL についての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。LDAP と LDAPS の両方の URL が使用できます。

URL は、次の方法で使用できます。
 
URL の使用法 サポート 備考
LDAP URL と LDAPS URL を使用して LDAP サービスプロバイダを設定する はい  
URL を InitialDirContext メソッドに名前として渡す はい  
LDAP 紹介で URL を使用する はい LDAP/LDAPS URL のスコープコンポーネントはサポートされる。属性、フィルタ、および拡張コンポーネントは無視される
URL が、listlistBindings、および search 列挙の名前として返される はい  
連合された名前空間に URL をリンクする はい  

注 - Java 2 SDK、v. 1.4.2 より前のシステムでは、LDAP サービスプロバイダは LDAPS URL を認識せず、また LDAPS URL を返しません。

6.2 LDAP サービスの自動検出

LDAP サービスプロバイダは、DNS 設定を使用した LDAP サービスの自動検出をサポートします。上記の使用例の LDAP/LDAPS URL でホスト名とポートが欠落し、識別名が指定されている場合、「サービスプロバイダに対する JNDI 実装側のガイドライン」で説明したとおり、LDAP サービスプロバイダは使用する LDAP サーバの検出を試みます。

たとえば、URL ldap:///dc=example,dc=com が指定されている場合、サービスプロバイダは DNS SRV レコードで _ldap._tcp.example.com を探そうと試みます。プロバイダがこのようなレコードを検出した場合、このレコードから LDAP サーバのホスト名とポートを抽出し、これらを使用します。プロバイダがこれらのレコードを使用する順序は、インターネット文書 draft-ietf-ldapext-locate-08.txt で説明するアルゴリズムに従います。

LDAP サービスの DNS SRV レコードを検出する場合、LDAP サービスプロバイダは基本プラットフォームに設定された DNS サービスを使用します (たとえば、Solaris または Linux では、DNS クライアント設定は /etc/resolv.conf ファイルから読み込まれる)。基本プラットフォームに DNS が設定されていない場合、LDAP サービスプロバイダは DNS サーバのホスト名とポートに localhost と 53 を使用します。DNS サービスが使用できない場合、または DNS サービスに LDAP サービスの SRV レコードがない場合、LDAP サービスプロバイダはホスト名に localhost を使用し、ポートにはプレーンな接続の場合は 389 を、SSL 接続の場合は 636 を使用します。

注 1: Java 2 SDK、v 1.4.1 より前のシステムでは、ホスト名とポートが指定されない場合、常にデフォルトの localhost と 389 が使用され、DNS を使用する試みは行われません。

注 2: Java 2 SDK、v 1.4.2 より前のシステムでは、SSL の使用とは関係なく、デフォルトのポートは常に 389 です。



7. Java オブジェクト

LDAP サービスプロバイダでは、次の種類のオブジェクトの格納および読み込みを行うことができます。詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。
 
格納および読み込みが可能なオブジェクト サポート 備考
Reference オブジェクト はい  
Referenceable オブジェクト はい  
Serializable オブジェクト はい  
DirContext オブジェクト はい  

例については、JNDI チュートリアルを参照してください。


8. スキーマ

LDAP サービスプロバイダのスキーマバインディングについての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。
 
スキーマツリー サポート 備考
AttributeDefinition はい  
ClassDefinition はい  
SyntaxDefinition はい  
MatchingRule はい  
ExtensionDefinition いいえ  
ControlDefinition いいえ  
SASLMechanism いいえ  


9. 例外

LDAP サービスプロバイダの、LDAP エラーコードの JNDI 例外へのマッピングについての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。
 


10. API マッピング

LDAP サービスプロバイダでは、次の JNDI API メソッドが LDAP にマッピングされます。詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。
 
Context メソッドのマッピング サポート 備考
addToEnvironment はい  
bind はい  
close はい  
composeName はい  
destroySubcontext はい  
getEnvironment はい  
getNameInNamespace はい  
getNameParser はい  
list はい  
listBindings はい  
lookup はい LinkRef は対象外
lookupLink はい  
rebind はい  
removeFromEnvironment はい  
rename はい  
unbind はい  
DirContext メソッドのマッピング サポート 備考
bind はい  
createSubcontext はい  
destroySubcontext はい  
getAttributes はい  
getSchema はい  
getSchemaClassDefinition はい  
modifyAttributes はい  
rebind はい  
search はい  
LdapContext メソッドのマッピング サポート 備考
extendedOperation はい  
getRequestControls はい  
getResponseControls はい  
newInstance はい  
reconnect はい  
setRequestControls はい  
EventDirContext メソッドのマッピング サポート 備考
addNamingListener はい  
removeNamingListener はい  
targetMustExist はい  


11. 連合

LDAP サービスプロバイダの連合についての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。次の連合方法がサポートされます。
 
連合方法 サポート 備考
連結 はい 下位のネームシステムが別の LDAP システムの場合は除く
暗黙的な次のネームシステムポインタ はい  
 

LDAP サービスプロバイダでは、複合名は「強く区分されている」と見なされます。つまり、複合名の最初のコンポーネントが識別名として処理され、残りのコンポーネントは次のネームシステムの名前として処理されます。たとえば、次の例では、次のネームシステムのルートのリストを出力しています。このネームシステムは、LDAP コンテキストを超えて連合されています。次に、マルチコンポーネントの複合名を使用して名前が参照されます。

// List the root of the nns, 
// Note use of the trailing slash to indicate traversal into the nns
NamingEnumeration enum = ctx.list("cn=objects,ou=Sales/");

// A composite name lookup
Object obj = ctx.lookup("cn=objects,ou=Sales/some/x/y/z");


12. イベントの通知

LDAP サービスプロバイダのイベントの通知についての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。次のイベントがサポートされます。
 
イベント サポート 備考
名前空間の変更の通知 はい 持続的検索コントロールを使用 (*)
オブジェクトの変更の通知 はい 持続的検索コントロールを使用 (*)
任意の通知 はい  

* 持続的検索コントロールは、「IETF インターネットドラフト draft-ietf-ldapext-psearch-03.txt」で定義されています。


13. SASL 認証

LDAP サービスプロバイダの SSL 認証についての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。

LDAP サービスプロバイダでは、次の SASL 機構がサポートされます。

このプロバイダでは、上記の機構に加えて、Java SASL API (JSR 28 Public Review Draft) に定義されたフレームワーク経由で利用できる SASL 機構がサポートされます。ただし例外として、パッケージの名前は javax.security.sasl でなく com.sun.security.sasl.preview になります。


14. SSL および Start TLS

14.1 SSL

LDAP サービスプロバイダの SSL についての詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。java.naming.ldap.factory.socket プロパティがほかのソケットファクトリのクラス名に設定されていない場合は、デフォルトの javax.net.ssl.SSLSocketFactory ソケットファクトリが使用されます。

SSL が使用され、ポートが指定されていない場合、デフォルトポートとして 636 が使用されます。

注 - Java 2 SDK、v 1.4.1 より前のシステムでは、SSL の使用とは関係なく、デフォルトのポートは常に 389 です。

14.2 TLS の起動

LDAP プロバイダでは、StartTlsResponse 抽象クラスの固定実装により、「Start TLS」拡張機能 (「1.3.6.1.4.1.1466.20037」) がサポートされます。ホスト名の検証は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」に従って実行されます。


15. 接続プール

注 - 接続プールは、Java 2 SDK、v 1.4.1 以降のリリースでのみサポートされます。

15.1 概要

LDAP サービスプロバイダは、以前に使用された接続のプールを維持することで接続プールをサポートします。LDAP プロバイダが接続を必要とする場合は常に (およびアプリケーションからプールが要求されている場合)、プールから接続を取得します。既存の接続が使用できる場合は、これが使用されます。既存の接続が使用できない場合、新しい接続が作成され、使用されます。プロバイダが接続を終了すると、接続はアイドルのマークが付けられ、再利用できます。

アプリケーションは、初期コンテキストコンストラクタに渡される環境プロパティにプロパティ com.sun.jndi.ldap.connect.pool を追加して、接続プールを要求します。アプリケーションは、「コンテキスト別」にプールを使用するか否かを、環境プロパティにこのプロパティを使用するかどうかによって指定することができます。初期コンテキストに渡される LDAP/LDAPS の両 URL の参照処理に、プールされた接続を使用するかどうかも、同じ機構を使用して制御されます。たとえば、プロバイダが参照を処理する場合に、環境プロパティにこのプロパティが含まれているとき、プロバイダは参照にプールされた接続を使用します。

次のコード例では、新しい初期コンテキストと、ここから導出されるすべてのコンテキストに接続プールを使用するように要求しています。

Hashtable env = new Hashtable();
env.put("com.sun.jndi.ldap.connect.pool", "true");
env.put(Context.PROVIDER_URL, url);
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
DirContext ctx = new InitialDirContext(env);
...

プロパティ com.sun.jndi.ldap.connect.pool の追加のみが必要です。これ以外のアプリケーションの変更は必要ありません。

LDAP プロバイダは、アプリケーションからの情報を元に接続が使用されているかどうかを追跡します。アプリケーションのコンテキストハンドルが開いている場合、そのアプリケーションが接続を使用しているものと見なします。したがって、LDAP プロバイダがプールされた接続を正しく管理するためには、コンテキストが不要になれば必ずアプリケーションで Context.close() を呼び出すようにする必要があります。

無効な接続は自動的に検出され、プールから削除されます。コンテキストが無効な接続により終了する確率は、接続プールを使用しているかどうかにかかわらず同じです。

15.2 プールを使用しない場合

プールされた接続は再利用を目的としています。したがって、コンテキストで基本接続の状態を変えるような操作を実行することが予定されるアプリケーションでは、コンテキストに接続プールを使用すべきではありません。特に、コンテキストに対して Start TLS 拡張機能操作を使用する予定があるアプリケーションの場合、または初期コンテキストの作成後にセキュリティ関連のプロパティ (java.naming.security.principaljava.naming.security.protocol など) を変更する予定があるアプリケーションの場合、そのコンテキストに接続プールを使用すべきではありません。このような状況で接続プールを使用した場合、アプリケーションのセキュリティが損なわれたり、予期しない動作が起こる場合があります。

15.3 グローバル設定

接続プールは、Java ランタイムごとに設定および管理されます。接続は異なるランタイム間で共有されません。接続プールを使用する場合、設定を変更する必要はありません。設定が必要になるのは、プールのサイズの制御、およびプールされる接続の指定など、プールの設定をカスタマイズする場合だけです。

接続プールは、ランタイム起動時にいくつかのシステムプロパティにより設定されます。設定に使用されるのは環境プロパティではなく「システム」プロパティであり、システムプロパティはすべての接続プール要求に適用されることに注意してください。

次にシステムプロパティの概要を示します。以降ではシステムプロパティについて詳細に説明します。

システムプロパティ名 説明 デフォルト設定
com.sun.jndi.ldap.connect.pool.authentication プールできる接続の、スペース区切りの認証タイプのリスト。「none」、「simple」、「DIGEST-MD5」のいずれかのタイプが使用できる 「none simple」
com.sun.jndi.ldap.connect.pool.debug 生成されるデバッグ出力のレベルを示す文字列。値には 「fine」 (接続の作成と削除をトレース) と「all」 (すべてのデバッグ情報) を使用できる  
com.sun.jndi.ldap.connect.pool.initsize ID に対して接続を最初に作成するときの接続数を、接続 ID 別に表す整数を文字列で表現したもの 1
com.sun.jndi.ldap.connect.pool.maxsize 同時に維持できる接続 ID 別の最大接続数を表す整数を、文字列で表現したもの なし
com.sun.jndi.ldap.connect.pool.prefsize 同時に維持しなければならない接続 ID 別の優先的接続数を表す整数を、文字列で表現したもの なし
com.sun.jndi.ldap.connect.pool.protocol プールできる接続の、スペース区切りのプロトコルタイプのリスト。「plain」と「ssl」のタイプが有効 「plain」
com.sun.jndi.ldap.connect.pool.timeout アイドル状態の接続が切断されず、プールから除外されることなくプール内に存在できる期間 (ミリ秒) を表す整数を、文字列で表現したもの なし

次のプールされた接続の例では、最大プールサイズを 20、優先的なプールサイズを 10、アイドルタイムアウトを 5 分に設定しています。

# java -Dcom.sun.jndi.ldap.connect.pool.maxsize=20 \
       -Dcom.sun.jndi.ldap.connect.pool.prefsize=10 \
       -Dcom.sun.jndi.ldap.connect.pool.timeout=300000 \
    YourProgram

15.3.1 プールの結果

LDAP プロバイダは、アプリケーションから要求され、接続の要求が「プール基準」に適合する場合にのみプールされた接続を使用します。アプリケーションは、com.sun.jndi.ldap.connect.pool 環境プロパティを使った接続のプールを要求します。デフォルトのプール基準では、簡単な認証を使用するか、まったく認証を用いないプレーンな (非 SSL) 接続のプールが許可されています。システムプロパティを使用してプール基準を変更し、SSL 接続および DIGEST-MD5 認証タイプを追加することも可能です。これ以外のプール基準のカスタマイズはサポートされていません。また、カスタムソケットファクトリの使用を要求する接続、またはプロトコルのトレース (com.sun.jndi.ldap.trace.ber 環境プロパティを使用) を有効にした接続はプールできません。

SSL 接続をプールする場合、com.sun.jndi.ldap.connect.pool.protocol システムプロパティに文字列「ssl」を追加します。たとえば、プレーン接続と SSL 接続をプールする場合は、システムプロパティを文字列「plain ssl」に設定します。

DIGEST-MD5 接続をプールする場合、com.sun.jndi.ldap.connect.pool.authentication システムプロパティに文字列「DIGEST-MD5」を追加します。たとえば、認証タイプが anonymous、simple、および DIGEST-MD5 の接続をプールする場合は、このシステムプロパティを文字列「none simple DIGEST-MD5」に設定します。

15.3.2 接続のプール方法

LDAP プロバイダは、再利用できるようにプールされた接続を管理します。アプリケーションからプールされた接続の使用が要求された場合、LDAP プロバイダは既存のプールされた接続で要求を満たすことが可能かどうかを判断する必要があります。この場合、プールされた各接続に「接続 ID」を割り当て、到着した要求の接続 ID がプールされた接続のいずれかと同じかどうかをチェックします。

接続 ID は認証が予測される LDAP 接続を作成するのに必要なパラメータセットです。その構成は、次の表に示すように要求の認証タイプにより異なります。

認証タイプ 接続 ID の内容
none
  • 接続コントロール
  • ホスト名、ポート番号、スキーマは、初期コンテキストに指定された java.naming.provider.url プロパティ、参照、または URL に従う
  • 次のプロパティの内容:
    java.naming.security.protocol
    java.naming.ldap.version
    
simple
  • anonymous にリストされたすべての情報
  • 次のプロパティの内容:
    java.naming.security.principal
    java.naming.security.credentials
    
DIGEST-MD5
  • simple にリストされたすべての情報
  • 次のプロパティの内容:
    java.naming.security.sasl.authorizationId
    java.naming.security.sasl.realm
    javax.security.sasl.qop
    javax.security.sasl.strength
    javax.security.sasl.server.authentication
    javax.security.sasl.maxbuffer
    javax.security.sasl.policy.noplaintext
    javax.security.sasl.policy.noactive
    javax.security.sasl.policy.nodictionary
    javax.security.sasl.policy.noanonymous
    javax.security.sasl.policy.forward
    javax.security.sasl.policy.credentials
    

15.3.3 プールのサイズ

LDAP プロバイダは接続のプールを管理します。各プールには同じ接続 ID を持つ (使用中かアイドル中の) 接続が格納されます。各プールの 3 つのサイズにより、管理方式が異なります。これらのサイズはグローバルであり、すべてのプールに影響します。

「初期サイズ」は、LDAP サービスプロバイダが最初にプールを作成するときに作成する、接続 ID 別の接続数です (アプリケーションから、当該の接続 ID に対してプールされた接続を最初に要求されたときの接続数と同じ)。プール内の各接続の認証は、接続が使用される時点で実行されます。デフォルトでは、初期プールサイズは 1 ですが、システムプロパティ com.sun.jndi.ldap.connect.pool.initsize を使用して変更することができます。通常、このサイズはアプリケーションの起動時に、一定の数のサーバ接続をプールに確保するために使用されます。

「最大プールサイズ」は、LDAP サービスプロバイダが同時に維持できる接続 ID 別の最大接続数です。使用中の接続とアイドル状態の接続を合計した数です。プールサイズがこの数に達した場合、プール内の接続が削除されるまで (つまり物理的な接続が切断されるまで)、対応する接続 ID の接続が新規に作成されることはありません。プールサイズが最大に達し、プール内のすべての接続が使用中の場合、プール内の接続がアイドル状態になるか削除されるまで、そのプールの接続に対するアプリケーションの要求は拒絶されます。最大プールサイズを 0 にすると、最大サイズがなくなります。プールされた接続への要求があれば、プールされた既存のアイドル状態の接続か、新規に作成されプールされた接続が使用されます。

「優先的プールサイズ」は、LDAP サービスプロバイダが維持する必要のある接続 ID 別の優先的接続数です。このサイズには、使用中の接続とアイドル状態の接続が関係します。アプリケーションがプールされた接続の使用を要求し、プールサイズが優先的サイズよりも小さい場合、LDAP プロバイダはアイドル状態の接続が利用できるかどうかにかかわらず、新しく接続を作成し、新しくプールされた接続を使用します。アプリケーションが接続を共有するすべてのコンテキストで Context.close() を呼び出してプールされた接続の使用を終了した時点で、プールのサイズが優先的サイズよりも大きい場合、LDAP プロバイダはプールされた接続を切断し、プールから削除します。優先的プールサイズを 0 にすると、優先的サイズがなくなります。プールされた接続への要求があれば、アイドル状態の接続が使用できない場合に限り、接続が新規に作成されます。

最大プールサイズは初期プールサイズおよび優先的プールサイズよりも優先されることに注意してください。たとえば、優先的プールサイズを最大プールサイズよりも大きく設定しても、実際には最大プールサイズに設定されます。

15.3.4 アイドル接続

アプリケーションが接続を共有するすべてのコンテキストで Context.close() を呼び出してプールされた接続の使用を終了すると、基になるプール接続にアイドルのマークが付けられ、再利用を待機します。デフォルトでは、アイドル接続はガーベージコレクトされるまでプール内に無限に存在し続けます。「com.sun.jndi.ldap.connect.pool.timeout」システムプロパティが設定されている場合、LDAP プロバイダは指定された期間を過ぎてもアイドル状態になっているプール接続を、自動的に切断し、削除します。

15.4 コンテキスト別設定

15.4.1 プールの有効化

プールを使用する場合、初期コンテキストコンストラクタに渡される環境プロパティで、com.sun.jndi.ldap.connect.pool プロパティを「true」に設定します。プロバイダは設定された環境プロパティにプール基準を適用し、そのコンテキストにプールを使用するかどうかを判断します。プロバイダが接続をプールできないと判断した場合、そのコンテキストに対して、プールされていない接続を作成し、使用します。

このプロパティを省略した場合、コンテキストで接続プールが使用されません。

15.4.2 接続タイムアウト

com.sun.jndi.ldap.connect.timeout 環境プロパティは、LDAP 接続を確立するときのタイムアウト期間の指定に使用されます。このプロパティは、LDAP サーバへの接続を開始する場合には TCP タイムアウトに影響します。接続プールが要求されている場合、プール内のすべての接続が使用され、最大プールサイズに到達しているときの最大待機時間もこのプロパティにより決定されます。

このプロパティが指定されていない場合、LDAP プロバイダはプールされた接続が利用できるまで無限に待機します。また新しい接続を作成するときにはデフォルトの TCP タイムアウトが有効になるのを待機します。

このプロパティは、アイドル状態のプール接続の削除に関連するシステムプロパティ com.sun.jndi.ldap.connect.pool.timeout とは異なることに注意してください。


16. セキュリティについて

セキュリティマネージャがインストールされている場合は、JNDI を使用するアプリケーションおよび LDAP サービスプロバイダに対して、次のアクセス権を割り当てる必要があります。

permission java.net.SocketPermission "host[:port]", "connect";
コンテキストメソッドに渡された java.naming.factory.initial プロパティおよび URL 文字列名に指定されている各ホストまたはポートに対して、割り当てられます。
permission java.net.SocketPermission "host[:port]", "connect,accept";
Serializable オブジェクトを使用して格納された References および javaCodebase 属性の URL 文字列に指定されている各ホストまたはポートに対して、割り当てられます。
SASL 認証を使用中に SASL クライアントファクトリをプログラムによって設定する場合は、アプリケーションに次のアクセス権を割り当ててください。
permission java.lang.RuntimePermission "setFactory"
さらに、「GSSAPI」 SASL 機構を使用する場合は、次のアクセス権も必要になります。
permission javax.security.auth.AuthPermission "createLoginContext.appClassName";
permission javax.security.auth.AuthPermission "doAsPrivileged";
ログインして doAsPrivileged メソッドを呼び出そうとしているアプリケーションクラス用のアクセス権です。
permission java.net.SocketPermission "host[:port]", "connect";
Kerberos Key Distribution Center (KDC) のホスト/ポート用のアクセス権です。
permission javax.security.auth.kerberos.ServicePermission "krbtgt/realm@realm", "initiate";
permission javax.security.auth.kerberos.ServicePermission "ldap/fully-qualified-hostname@realm", "initiate";
LDAP サービスと KDC の範囲とホスト用のアクセス権です。


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