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

目次

  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チュートリアルを参照してください。

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 SE 1.4.1以前のシステムでは、単一のURLのみが含まれます。Java SE 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固有の環境プロパティをサポートします。
 
プロパティ サポート 備考
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」である場合、接続を作成するためのパラメータ(接続要求と呼ばれる)が接続プール構成で規定される基準を満たしていれば、プロバイダはプールされた接続を使用します。このプロパティが設定されていない場合、またはほかの値に設定されている場合、あるいは接続要求が基準に一致しない場合、プロバイダはプールされた接続を使用しません。接続プールについては、「接続プール」を参照してください。

たとえば、次のコードを実行したとします

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

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

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

次に例を示します。

env.put("com.sun.jndi.ldap.connect.timeout", "500");を指定すると、0.5秒以内に接続を確立できない場合、LDAPサービス・プロバイダは接続試行を中止します。

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

com.sun.jndi.ldap.read.timeout

このプロパティの値は、LDAP操作のための読取りタイム・アウトのミリ秒数を示す整数を文字列で表現したものです。LDAPプロバイダがこの値の期間中にLDAP応答を取得できないと、読取りの試行は中止されます。整数は0より大きい必要があります。0以下の整数は、読取りタイム・アウトが指定されていないことを表し、応答があるまで無限に待機するということです。

このプロパティを指定しないと、デフォルトは応答があるまで待つという設定になります。

次に例を示します。

env.put("com.sun.jndi.ldap.read.timeout", "5000");を指定すると、サーバーが5秒以内に応答しない場合、LDAPサービス・プロバイダは読取りの試行を中止します。

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のスキーマを更新する場合は、このプロパティを使用してこれらの問題を回避する必要があります。

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

        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サービス・プロバイダのガイドライン」の説明に従った名前をサポートします。次の形式のLDAP識別名がサポートされています。
 
識別名の形式 備考
String 合成名とみなされます。合成名の最初のコンポーネントは、識別名として処理されます。残りのコンポーネントは連合されます。
Name CompositeNameのインスタンスの場合は、合成名として処理します。つまり、合成名の最初のコンポーネントを識別名として処理し、残りを連合に使用します。それ以外の場合は、解析されたLDAP名として処理します。ここで、Nameの各コンポーネントは、RFC 2253で定義されているLDAP名のコンポーネントです。
LDAP URL文字列 初期コンテキストに渡されると、LDAP URL文字列はRFC 2255に基づいて解釈され、その識別名コンポーネントはRFC 2253に基づいて解釈されます。
LDAPS URL文字列 LDAPS URL文字列は、初期コンテキストに渡されると、サーバーとの通信にSSL接続が使用される点を除き、LDAP URLと同じように解釈されます。

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


5. 属性

LDAPサービス・プロバイダは、「LDAPサービス・プロバイダのガイドライン」の説明に従った属性をサポートします。LDAP属性値を指定するための次の形式がサポートされています。
 
属性値の形式 サポート 備考
String はい  
byte[] はい  

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

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

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

すべての属性値について、それがStringbyte[]かには関係なく、その属性値の構文と形式がわかっている必要があります。属性値の構文と形式は、これらの情報が定義されているスキーマ・ドキュメントで確認できます。

属性が引数としてJNDI呼出しに渡される場合、それらの属性は、LDAPディレクトリで適用されるすべてのスキーマを満たしている必要があります。 特に、新しいLDAPエントリを作成している場合(たとえば、Context.bindContext.rebind、またはDirContext.createSubcontextを使用している場合)は通常、objectClass属性が必要です。


6. URL

6.1 使用法

LDAPサービス・プロバイダは、「LDAPサービス・プロバイダのガイドライン」の説明に従ったURLをサポートします。LDAPとLDAPSの両方のURLが使用できます。

URLの次の使用がサポートされています。
 

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

6.2 LDAPサービスの自動検出

LDAPサービス・プロバイダは、DNS設定を使用したLDAPサービスの自動検出をサポートします。上記の使用例のLDAP/LDAPS URLにホスト名とポートがないが、空でない識別名が含まれている場合、「LDAPサービス・プロバイダのガイドライン」で説明されているように、LDAPサービス・プロバイダは使用するLDAPサーバーの検出を試みます。

たとえば、ldap:///dc=example,dc=comのURLが指定されている場合、サービス・プロバイダは、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を使用します。



7. Javaオブジェクト

LDAPサービス・プロバイダは、「LDAPサービス・プロバイダのガイドライン」で指定されている次の種類のオブジェクトの格納と読取りをサポートします。
 
格納および読取りが可能なオブジェクト サポート 備考
Referenceオブジェクト はい  
Referenceableオブジェクト はい  
Serializableオブジェクト はい  
DirContextオブジェクト はい  

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


8. スキーマ

LDAPサービス・プロバイダは、「LDAPサービス・プロバイダのガイドライン」で指定されている次のスキーマ・バインディングをサポートします。
 
スキーマ・ツリー サポート 備考
AttributeDefinition はい  
ClassDefinition はい  
SyntaxDefinition はい  
MatchingRule はい  
ExtensionDefinition いいえ  
ControlDefinition いいえ  
SASLMechanism いいえ  

9. 例外

LDAPサービス・プロバイダは、「LDAPサービス・プロバイダに対するJNDI実装側のガイドライン」に従って、LDAPエラー・コードをJNDI例外にマップします。
 

10. APIマッピング

LDAPサービス・プロバイダは、「LDAPサービス・プロバイダに対するJNDI実装側のガイドライン」に従って、次のJNDI APIメソッドをLDAPにマップします。
 
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サービス・プロバイダのガイドライン」の説明に従った連合をサポートします。次の連合方法がサポートされています。
 
連合方法 サポート 備考
連結 はい 下位のネーミング・システムが別の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サービス・プロバイダのガイドライン」の説明に従ったイベント通知をサポートします。次のイベントがサポートされています。
 
Event サポート 備考
名前空間の変更の通知 はい 持続的検索コントロールを使用*
オブジェクトの変更の通知 はい 持続的検索コントロールを使用*
非要請通知 はい  

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


13. SASL認証

LDAPサービス・プロバイダは、「LDAPサービス・プロバイダのガイドライン」の説明に従ったSASL認証をサポートします。

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サービス・プロバイダは、「LDAPサービス・プロバイダのガイドライン」の説明に従ったSSLをサポートします。java.naming.ldap.factory.socket プロパティがほかのソケット・ファクトリのクラス名に設定されていないかぎり、デフォルトのソケット・ファクトリjavax.net.ssl.SSLSocketFactoryが使用されます。

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

14.2 TLSの起動

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

15. 接続プール

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);
...

1つのプロパティ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 カスタム・ソケット・ファクトリの接続のプール

java.naming.ldap.factory.socket環境プロパティが設定されている場合は、カスタム・ソケット・ファクトリからの接続のプールが許可されます。カスタム・ソケット・ファクトリをプールするには、ソケット・ファクトリ・クラスがComparatorインタフェースを実装する必要があります。LDAPサービス・プロバイダは、プール・メカニズムによって接続の同等性がチェックされているソケット・ファクトリの同等性を比較するためにComparator.compare()メソッドを呼び出します。ソケット・ファクトリの比較では必ず、接続の同等性に影響を及ぼすソケット・ファクトリのパラメータが比較されるようにします。この比較は、「接続のプール方法」で説明した接続IDの比較と合わせて行われます。カスタム・ソケット・ファクトリ・クラスは、その接続がプールされる場合、必ず次のような構造となります。
    public class CustomSocketFactory extends SocketFactory
                implements Comparator<SocketFactory> { 
       :
       :
       public int compare(SocketFactory sf1, SocketFactory sf2) {
           :
           :
           // do whatever comparison that's required
       }
    }

ソケット・ファクトリ・クラスがComparatorインタフェースを実装しない場合、ソケット・ファクトリ・クラスの接続はプールできません。このComparatorインタフェースの実装要件は、LDAPサービス・プロバイダが実装を認識していない別のソケット・ファクトリの接続を比較する場合、必ずLDAPサービス・プロバイダが必要なチェックを行うことです。

15.3.4 プールのサイズ

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.5 アイドル接続

アプリケーションが(接続を共有するすべてのコンテキストで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 © 1993, 2020, Oracle and/or its affiliates. All rights reserved.