コメントの送付先: jndi@java.sun.com
目次
このドキュメントでは、LDAP サービスプロバイダの機能について説明します。主に、LDAP サービスプロバイダの動作を中心に説明します。詳細は、「LDAP サービスプロバイダに対する JNDI 実装側のガイドライン」を参照してください。例および使用方法については、JNDI チュートリアルを参照してください。
LDAP サービスプロバイダには、LDAP アクセスの基本機能が実装されます。汎用的な LDAP コントロール、RMI オブジェクトと CORBA オブジェクトの格納および読み込みに対するサポートなどを基本プロバイダに追加する場合は、「ブースターパック」をインストールしてください。「ブースターパック」は、JNDI の Web サイトからダウンロードできます。
標準 | サポート | 備考 |
---|---|---|
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) | はい |
プロパティ | サポート | 備考 |
---|---|---|
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 | はい | simple、none、SASL 機構のリスト |
java.naming.security.credentials | はい | |
java.naming.security.principal | はい | |
java.naming.security.protocol | はい | ssl |
プロパティ | サポート | 備考 |
---|---|---|
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 | はい |
このプロパティを使用して、初期コンテキストインスタンスを作成するときに、プールされた接続を使用する必要があることを指定します。この値が「true」の場合、接続を作成するためのパラメータ (connection request と呼ばれる) が、接続プール設定で規定される基準に一致すれば、プロバイダはプールされた接続を使用します。このプロパティが設定されていない場合、または他の値に設定されている場合、あるいは接続要求が基準に一致しない場合、プロバイダはプールされた接続を使用しません。接続プールの詳細は、「接続プール」を参照してください。次に例を示します。
env.put("com.sun.jndi.ldap.connect.pool", "true");LDAP プロバイダに、初期コンテキストの作成時にプールされた接続を使用するように指示します。注 - Java 2 SDK、v 1.4.1 以前のシステムでは、接続プールはサポートされていません。このため、このプロパティは無視されます。
このプロパティの値は、接続タイムアウトのミリ秒数を示す整数を文字列で表現したものです。LDAP プロバイダがこの値の期間中に接続を確立できないと、接続の試行は中止されます。整数は 0 より大きい必要があります。0 以下の整数を指定した場合は、TCP などのネットワークプロトコルのタイムアウト値が使用されます。このプロパティが指定されない場合は、接続が確立されるのを待機するか、または基本となるネットワークのタイムアウトまで待機します。
次に例を示します。
env.put("com.sun.jndi.ldap.connect.timeout", "500");0.5 秒以内に接続が確立されない場合、LDAP サービスプロバイダによる接続試行が中止されます。接続のために接続プールが要求されている場合、プール内のすべての接続が使用され、かつ最大プールサイズに到達しているときの、接続の最大待機時間がこのプロパティにより決定されます。このような状況下で、このプロパティの値がゼロ以下に設定されている場合、プロバイダは接続が可能になるまで無限に待機することになります。それ以外の値に設定されている場合は、プロバイダは最大待機時間を超えた時点で、待機を中断します。詳細は、「接続プール」を参照してください。
注 - Java 2 SDK の v 1.4 より前のシステムでは、接続タイムアウトが SDK でサポートされないため、このプロパティは無視されます。
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 など) を追加することにより、このバグを回避してください。
このプロパティの値は、java.io.OutputStream オブジェクトです。このオブジェクトに対して、LDAP ASN.1 BER の送受信パケットの 16 進ダンプが書き込まれます。このプロパティのデフォルトは定義されていません。
次に例を示します。
env.put("com.sun.jndi.ldap.trace.ber", System.out);この場合、LDAP プロトコルトレースは標準の出力ストリームに書き込まれます。注 - このプロパティは、初期コンテキストにだけ渡され、そのプロバイダで固定されます。addToEnvironment または removeFromEnvironment メソッドには影響されません。
識別名の形式 | 備考 |
---|---|
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 に基づいて文字列名を解析し、コンポーネントに渡します。
属性値の形式 | サポート | 備考 |
---|---|---|
String 値 | はい | |
byte[] 値 | はい |
一部の LDAP サーバでは、属性値に対して言語の優先順位を指定するときに、属性の部分型、属性名の類語、および言語コードを使用することができます。この場合、LDAP サーバから返された属性名は、要求した属性名と異なることがあります。
LDAP では、属性名の大文字と小文字が区別されます。このため、パラメータとして JNDI 操作に渡す属性のまとまりを作成するときは、大文字と小文字が区別される属性クラスを使用することをお勧めします。次に例を示します。
Attributes attrs = new BasicAttributes(true); // ignoreCase=true
属性値を使用するときは、String および byte[] のどちらの場合も、その属性値の構文と形式の情報が必要です。属性値の構文と形式は、これらの情報が定義されているスキーマドキュメントで確認できます。
属性を JNDI 呼び出しに引数として渡すときは、その属性は LDAP ディレクトリに適用されているすべてのスキーマに準拠していなければなりません。特に、新しい LDAP を作成するときは (Context.bind、Context.rebind、または DirContext.createSubcontext を使用するときなど)、通常 objectClass 属性が必要です。
URL は、次の方法で使用できます。
URL の使用法 | サポート | 備考 |
---|---|---|
LDAP URL と LDAPS URL を使用して LDAP サービスプロバイダを設定する | はい | |
URL を InitialDirContext メソッドに名前として渡す | はい | |
LDAP 紹介で URL を使用する | はい | LDAP/LDAPS URL のスコープコンポーネントはサポートされる。属性、フィルタ、および拡張コンポーネントは無視される |
URL が、list、listBindings、および search 列挙の名前として返される | はい | |
連合された名前空間に URL をリンクする | はい |
注 - Java 2 SDK、v. 1.4.2 より前のシステムでは、LDAP サービスプロバイダは LDAPS URL を認識せず、また LDAPS URL を返しません。
たとえば、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 です。
格納および読み込みが可能なオブジェクト | サポート | 備考 |
---|---|---|
Reference オブジェクト | はい | |
Referenceable オブジェクト | はい | |
Serializable オブジェクト | はい | |
DirContext オブジェクト | はい |
例については、JNDI チュートリアルを参照してください。
スキーマツリー | サポート | 備考 |
---|---|---|
AttributeDefinition | はい | |
ClassDefinition | はい | |
SyntaxDefinition | はい | |
MatchingRule | はい | |
ExtensionDefinition | いいえ | |
ControlDefinition | いいえ | |
SASLMechanism | いいえ |
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 | はい |
連合方法 | サポート | 備考 |
---|---|---|
連結 | はい | 下位のネームシステムが別の 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");
イベント | サポート | 備考 |
---|---|---|
名前空間の変更の通知 | はい | 持続的検索コントロールを使用 (*) |
オブジェクトの変更の通知 | はい | 持続的検索コントロールを使用 (*) |
任意の通知 | はい |
* 持続的検索コントロールは、「IETF インターネットドラフト draft-ietf-ldapext-psearch-03.txt」で定義されています。
LDAP サービスプロバイダでは、次の SASL 機構がサポートされます。
SSL が使用され、ポートが指定されていない場合、デフォルトポートとして 636 が使用されます。
注 - Java 2 SDK、v 1.4.1 より前のシステムでは、SSL の使用とは関係なく、デフォルトのポートは常に 389 です。
注 - 接続プールは、Java 2 SDK、v 1.4.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() を呼び出すようにする必要があります。
無効な接続は自動的に検出され、プールから削除されます。コンテキストが無効な接続により終了する確率は、接続プールを使用しているかどうかにかかわらず同じです。
接続プールは、ランタイム起動時にいくつかのシステムプロパティにより設定されます。設定に使用されるのは環境プロパティではなく「システム」プロパティであり、システムプロパティはすべての接続プール要求に適用されることに注意してください。
次にシステムプロパティの概要を示します。以降ではシステムプロパティについて詳細に説明します。
システムプロパティ名 | 説明 | デフォルト設定 |
---|---|---|
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
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」に設定します。
接続 ID は認証が予測される LDAP 接続を作成するのに必要なパラメータセットです。その構成は、次の表に示すように要求の認証タイプにより異なります。
認証タイプ | 接続 ID の内容 |
---|---|
none |
|
simple |
|
DIGEST-MD5 |
|
「初期サイズ」は、LDAP サービスプロバイダが最初にプールを作成するときに作成する、接続 ID 別の接続数です (アプリケーションから、当該の接続 ID に対してプールされた接続を最初に要求されたときの接続数と同じ)。プール内の各接続の認証は、接続が使用される時点で実行されます。デフォルトでは、初期プールサイズは 1 ですが、システムプロパティ com.sun.jndi.ldap.connect.pool.initsize を使用して変更することができます。通常、このサイズはアプリケーションの起動時に、一定の数のサーバ接続をプールに確保するために使用されます。
「最大プールサイズ」は、LDAP サービスプロバイダが同時に維持できる接続 ID 別の最大接続数です。使用中の接続とアイドル状態の接続を合計した数です。プールサイズがこの数に達した場合、プール内の接続が削除されるまで (つまり物理的な接続が切断されるまで)、対応する接続 ID の接続が新規に作成されることはありません。プールサイズが最大に達し、プール内のすべての接続が使用中の場合、プール内の接続がアイドル状態になるか削除されるまで、そのプールの接続に対するアプリケーションの要求は拒絶されます。最大プールサイズを 0 にすると、最大サイズがなくなります。プールされた接続への要求があれば、プールされた既存のアイドル状態の接続か、新規に作成されプールされた接続が使用されます。
「優先的プールサイズ」は、LDAP サービスプロバイダが維持する必要のある接続 ID 別の優先的接続数です。このサイズには、使用中の接続とアイドル状態の接続が関係します。アプリケーションがプールされた接続の使用を要求し、プールサイズが優先的サイズよりも小さい場合、LDAP プロバイダはアイドル状態の接続が利用できるかどうかにかかわらず、新しく接続を作成し、新しくプールされた接続を使用します。アプリケーションが接続を共有するすべてのコンテキストで Context.close() を呼び出してプールされた接続の使用を終了した時点で、プールのサイズが優先的サイズよりも大きい場合、LDAP プロバイダはプールされた接続を切断し、プールから削除します。優先的プールサイズを 0 にすると、優先的サイズがなくなります。プールされた接続への要求があれば、アイドル状態の接続が使用できない場合に限り、接続が新規に作成されます。
最大プールサイズは初期プールサイズおよび優先的プールサイズよりも優先されることに注意してください。たとえば、優先的プールサイズを最大プールサイズよりも大きく設定しても、実際には最大プールサイズに設定されます。
このプロパティを省略した場合、コンテキストで接続プールが使用されません。
このプロパティが指定されていない場合、LDAP プロバイダはプールされた接続が利用できるまで無限に待機します。また新しい接続を作成するときにはデフォルトの TCP タイムアウトが有効になるのを待機します。
このプロパティは、アイドル状態のプール接続の削除に関連するシステムプロパティ com.sun.jndi.ldap.connect.pool.timeout とは異なることに注意してください。
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 の範囲とホスト用のアクセス権です。