目次
このドキュメントでは、LDAPサービス・プロバイダの機能について説明します。主に、LDAPサービス・プロバイダの動作を中心に説明します。詳細は、「LDAPサービス・プロバイダのガイドライン」を参照してください。このプロバイダの例および使用方法の説明については、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 SE 1.4.1以前のシステムでは、単一のURLのみが含まれます。Java SE 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」である場合、接続を作成するためのパラメータ(接続要求と呼ばれる)が接続プール構成で規定される基準を満たしていれば、プロバイダはプールされた接続を使用します。このプロパティが設定されていない場合、またはほかの値に設定されている場合、あるいは接続要求が基準に一致しない場合、プロバイダはプールされた接続を使用しません。接続プールについては、「接続プール」を参照してください。
たとえば、次のコードを実行したとします
env.put("com.sun.jndi.ldap.connect.pool", "true");LDAPプロバイダに、初期コンテキストの作成時にプールされた接続を使用するように指示します。
このプロパティの値は、接続タイム・アウトのミリ秒数を示す整数を文字列で表現したものです。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サービス・プロバイダは読取りの試行を中止します。
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など)を追加することにより、このバグを回避してください。
このプロパティの値は、java.io.OutputStreamオブジェクトです。ここには、受信および送信LDAP ASN.1 BERパケットの16進数ダンプが書き込まれます。このプロパティのデフォルトは定義されていません。
次に例を示します。
env.put("com.sun.jndi.ldap.trace.ber", System.out);この場合、LDAPプロトコル・トレースは標準の出力ストリームに書き込まれます。
注: このプロパティは、初期コンテキストにだけ渡され、そのプロバイダで固定されます。addToEnvironmentまたはremoveFromEnvironmentメソッドには影響されません。
識別名の形式 | 備考 |
---|---|
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に基づいてコンポーネントに構文解析します。
属性値の形式 | サポート | 備考 |
---|---|---|
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サービス・プロバイダを設定する。 | はい | |
InitialDirContextメソッドに名前として渡されるURL。 | はい | |
LDAP照会でURLを使用する | はい | LDAP/LDAPS URLのスコープ・コンポーネントはサポートされます。属性、フィルタ、および拡張コンポーネントは無視されます。 |
list、listBindings、およびsearch列挙内の名前として返されるURL。 | はい | |
連合された名前空間にURLをリンクする。 | はい |
たとえば、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を使用します。
格納および読取りが可能なオブジェクト | サポート | 備考 |
---|---|---|
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");
Event | サポート | 備考 |
---|---|---|
名前空間の変更の通知 | はい | 持続的検索コントロールを使用* |
オブジェクトの変更の通知 | はい | 持続的検索コントロールを使用* |
非要請通知 | はい |
*持続的検索コントロールは、IETFインターネット・ドラフトdraft-ietf-ldapext-psearch-03.txtで定義されています。
LDAPサービス・プロバイダでは、次のSASLメカニズムがサポートされます。
SSLが使用され、ポートが指定されていない場合、デフォルト・ポートとして636が使用されます。
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()を呼び出す必要があります。
無効な接続は自動的に検出され、プールから削除されます。コンテキストが無効な接続により終了する確率は、接続プールを使用しているかどうかにかかわらず同じです。
接続プールは、ランタイム起動時にいくつかのシステム・プロパティにより設定されます。これらは環境プロパティではなく、システム・プロパティであるため、すべての接続プール要求に影響を与えることに注意してください。
次にシステム・プロパティのサマリーを示します。以降ではシステム・プロパティについて詳細に説明します。
システム・プロパティ名 | 説明 | デフォルト |
---|---|---|
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 |
|
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サービス・プロバイダが必要なチェックを行うことです。
初期プール・サイズは、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の範囲とホスト用のアクセス権です。