コメントの送付先: jndi@java.sun.com
このドキュメントで説明するすべての機能を、LDAP サービスプロバイダがサポートしなければならないわけではありません。ただし、ある機能をサポートする場合、そのサポート方法はこのドキュメントに説明された方法に従う必要があります。
LDAP サービスプロバイダに影響を及ぼす環境プロパティーには 4 つのタイプがあります。
特に、次のプロパティーのいずれかが環境プロパティー内で提供されていない場合、システムプロパティー、アプレットパラメータ、およびプロバイダとアプリケーションのリソースファイルの両方から、次に示す順序で検索されます。
コンテキストの環境プロパティーは、Context.getEnvironment メソッドを使って検査できます。
コンテキストの環境プロパティーからあるプロパティーを削除する場合、コンテキストはそのプロパティーにはデフォルトの動作が割り当てられているものとみなします。ただし、プロパティーの値としてデフォルト値を指定しなければならないという意味ではありません。削除は、コンテキストの環境プロパティーにそのプロパティーが存在しないことによっても示されます。
プロパティーの値は、サーバーから返される検索結果のバッチサイズを指定する 10 進数の文字列です。このプロパティーは、Context.list、Context.listBindings、および DirContext.search メソッドのブロック動作およびこれらのメソッドが返す NamingEnumeration オブジェクトに影響を及ぼします。これは、返される列挙内の項目数には影響しません。LDAP プロトコルレベルで項目のバッチ処理または読み取りが行われる方法だけに影響を与えます。
値をゼロに設定すると、それは、すべての結果が受け取られるまでプロバイダがブロックすることを意味します。ゼロより大きい整数 n を設定することは、サーバーから結果 n を受け取るまで、または列挙が終わるまで、プロバイダがブロックすることを意味します。どちらの場合にも、生成される結果の数はより小さい値になります。アプリケーションが結果 n を読み取った後 (NamingEnumeration.next または NamingEnumeration.nextElement を使用して)、プロバイダはサーバーからさらに n 個の結果を読み取るか、列挙が終わるまで結果を読み取ります。 どちらの場合にも、生成される結果の数はより小さい値になります。
このプロパティーが設定されない場合、デフォルト値は実装固有の値になります。
次に例を示します。
これは、サーバーから 24 エントリが読み取られるか、列挙が終了するまで、プロバイダがブロックすることを意味します。どちらの場合にも、生成される結果の数はより小さい値になります。env.put(Context.BATCHSIZE, "24");
このプロパティーの値は、コントロールファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。ファクトリは、応答コントロールを行うクラスの「ナロー変換」変換を行います。これらのファクトリは、プロバイダが生成する総称的な応答コントロールから固有の応答コントロールを作成します。
このプロパティーのデフォルト値は定義されていません。
次に例を示します。
これは、ResponseControlFactory クラスを、試行対象のコントロールファクトリとして設定します。env.put(LdapContext.CONTROL_FACTORIES, "com.sun.jndi.ldap.ctl.ResponseControlFactory");
このプロパティーの値は、LDAP サービスプロバイダの初期コンテキストを作成するファクトリクラスの完全修飾されたクラス名です。これは、特定の LDAP サービスプロバイダを選択するために使用します。プロバイダ自身が使用することはありません。初期コンテキストメソッドへの名前引数が URL である場合には、このプロパティーを設定する必要はありません。
このプロパティーのデフォルト値は定義されていません。
次に例を示します。
env.put(Context.INITIAL_CONTEXT_FACTORY,これは、Sun の LDAP プロバイダを選択します。
"com.sun.jndi.ldap.LdapCtxFactory");
このプロパティーの値は、オブジェクトファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。ファクトリは、プロバイダから返された LDAP エントリから特定のオブジェクトを作成します。たとえば、Person オブジェクトファクトリが、オブジェクトクラス person の LDAP エントリから Person オブジェクトを生成するとします。オブジェクトファクトリは、LDAP 属性からオブジェクトを生成するという点で、状態ファクトリとは反対の動作を実行します。
このプロパティーのデフォルト値は定義されていません。
次に例を示します。
これは、PersonFromLDAP クラスを、試行対象のオブジェクトファクトリとして設定します。env.put(Context.OBJECT_FACTORIES, "com.sun.jndi.ldap.obj.PersonFromLDAP");
このプロパティーの値は、状態ファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。このファクトリは、オブジェクト自体からオブジェクトの状態 (格納用) を作成します。たとえば、Person 状態ファクトリは、Person オブジェクトからオブジェクトクラス person のLDAP エントリを生成します。状態ファクトリは、オブジェクトから LDAP 属性を生成するという点で、オブジェクトファクトリとは反対の動作を実行します。
このプロパティーのデフォルト値は定義されていません。
次に例を示します。
これは、PersonToLDAP クラスを、試行対象の状態ファクトリとして設定します。env.put(Context.STATE_FACTORIES, "com.sun.jndi.ldap.obj.PersonToLDAP");
このプロパティーの値は、RFC 1766 に準拠した文字列言語タグです。
このプロパティーが与える影響は、実装固有です。デフォルト値は定義されていません。
例を示します。
env.put(Context.LANGUAGE, "ja-JP");
このプロパティーの値は、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」を参照してください。 次に例を示します。
例を示します。
これは、LDAP サーバーが secserver という名前のホスト上のポート 636 で稼動中であることを示します。env.put(Context.PROVIDER_URL, "ldap://secserver:636");注 - Context.addToEnvironment メソッドまたは Context.removeFromEnvironment メソッドを使ってこのプロパティーを変更しても、コンテキストには影響ありません。このプロパティーを使用するのは、初期コンテキストコンストラクタだけです。
このプロパティーの値は、プロバイダが照会を処理する方法を指定する文字列です。次の値は、このプロパティー用に定義されたものです。
単一の照会エントリ内で検出される複数の URL の処理方法については、「URL」 を参照してください。
このプロパティーが設定されない場合、デフォルト値は ignore になります。
例を示します。
env.put(Context.REFERRAL, "throw");
このプロパティーの値は、使用するプロバイダ用の認証機構を指定する文字列です。次の値は、このプロパティー用に定義されたものです。
SASL 認証でこのプロパティーを使用する方法については、SASL を参照してください。LDAP 認証機構の詳細については、RFC 2829 を参照してください。
このプロパティーが設定されない場合、java.naming.security.credentials プロパティーが設定されない限り、そのデフォルト値は none になります。 java.naming.security.credentials プロパティーが設定された場合のデフォルト値は simple です。このプロパティーが、プロバイダが認識またはサポートしない値に設定される場合、AuthenticationNotSupportedException がスローされます。
例を示します。
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5 CRAM-MD5");
匿名バインドの場合、このプロパティーは無視され、常に空白文字列がクレデンシャルとして使用されます。簡単な認証の場合、およびパスワードを要求する SASL 認証の場合、このプロパティーの値は java.lang.String、char[]、または byte[] として提供されます。このプロパティーの値が String または char[] の場合、LDAPv3 では UTF-8 を使用してバイト配列に符号化され、LDAPv2 では ISO-Latin-1 を使用して符号化されます。このプロパティーの値が byte[] の場合には、そのままの形式で使用されます。
SASL 認証でこのプロパティーを使用する方法については、SASL を参照してください。
このプロパティーのデフォルト値は定義されていません。
例を示します。
env.put(Context.SECURITY_CREDENTIALS, "secret");
このプロパティーの値は、認証対象のプリンシパルのアイデンティティーを指定する文字列です。その形式は認証の種類によって異なります。詳細については RFC 2829 を参照してください。その値は、SASL 以外の認証用の LDAP ASN.1 BindRequest の name コンポーネントとして使用されます。SASL 認証の場合、このプロパティーの値は、認証 ID を必要とする SASL 機構の認証 ID として使用されます。プロバイダが、プリンシパル名の有効性を検証する必要はありません。プロバイダは、たとえば、サーバーにより検証される文字列を渡すなどの処理を行うだけです。識別されるプリンシパルが有効なプリンシパルではない場合、プロバイダは AuthenticationException をスローします。
このプロパティーのデフォルト値は定義されていません。
例を示します。
これは、プリンシパル名として識別名「cn=admin, o=sun, c=us」を設定します。env.put(Context.SECURITY_PRINCIPAL, "cn=admin,o=sun,c=us");
このプロパティーが ssl に設定されている場合、プロバイダは SSL ソケットを使用する必要があります。SSL ソケットを使用できない場合は、ConfigurationException をスローする必要があります。上記の値リストに加え、プロバイダは他のセキュリティープロトコルをサポートすることもできます。ただし、そのようなプロバイダ固有のプロトコルを、すべてのプロバイダがサポートするわけではありません。このプロパティーが、プロバイダが認識またはサポートしないセキュリティープロトコルに設定される場合、ConfigurationException がスローされます。
java.naming.ldap.factory.socket プロパティーが設定されている場合、そのプロパティーで識別されるソケットファクトリは、このプロトコルの設定に適したソケットを作成する必要があります。たとえば、セキュリティープロトコルが ssl に設定されると、ソケットファクトリは SSL に準拠したソケットを作成する必要があります。
このプロパティーを設定しない場合には、セキュリティープロトコルを使用しないことがデフォルトになります。
LDAP プロバイダの開発者は、SSL 接続を待機しないポート上のサーバーへの接続に SSL を使用するなら、ソケットがハングアップすることを明記しておく必要があります。同様に、SSL 接続を待機するサーバーへの接続にプレーンなソケットを使用してもハングアップが引き起こされます。これは、実装によっては訂正が実行されることはあるが、他の実装の場合には訂正を実行する必要はない、というプロトコルの特性です。ただし、プロバイダのドキュメント内で、この動作をユーザーに説明する必要があります。SSL の使用方法については、SSL を参照してください。
例を示します。
env.put(Context.SECURITY_PROTOCOL, "ssl");
デフォルトは定義されていません。このプロパティーが設定されない場合、次の属性だけが非文字列構文を保持するとみなされます。
属性 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");
このプロパティーのデフォルト値は定義されていません。
例を示します。
env.put("java.naming.ldap.control.connect", new Control[]{ new ManageReferralControl(true) });
例を示します。
env.put("java.naming.ldap.deleteRDN", "false");
このプロパティーの値は、検索操作中に別名を間接参照する方法を指定する文字列です。次の値は、このプロパティー用に定義されたものです。
always 常に別名を間接参照します。 never 別名を間接参照しません。 finding 名前解決中 (つまり、ターゲットエントリの位置の検出中) だけ別名を間接参照します。 searching 名前解決完了後 (つまり、ターゲットエントリの位置検出後) に別名を間接参照します。
このプロパティーが設定されない場合、デフォルト値は always になります。
例を示します。
これは、ターゲットエントリの検出後に、プロバイダが一度だけ別名を間接参照するよう指定します。
env.put("java.naming.ldap.derefAliases", "searching");注 - このプロパティーは、SearchControls オブジェクトの間接参照リンクフラグとは無関係です。
このプロパティーは、デフォルトのソケットファクトリをオーバーライドするために使用されます。このプロパティーで指定されたクラスは、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");
このプロパティーは、デフォルトの区切り文字が RefAddr オブジェクトのコンポーネント内に現れる場合に、衝突を避けるために使用します。
このプロパティーが設定されない場合、デフォルト値は 「#」(ハッシュ文字) になります。
例を示します。
env.put("java.naming.ldap.ref.separator", ":");
このプロパティーが設定されない場合、デフォルト値は 10 になります。
例を示します。
env.put("java.naming.ldap.referral.limit", "5");
このプロパティーが設定されない場合、デフォルト値は false になります。
例を示します。
env.put("java.naming.ldap.typesOnly", "true");
このプロパティーが設定されない場合、プロバイダはまず LDAP v3 を使ってバインドを試みます。サーバーからプロトコルエラーを受信すると LDAP v2 を使って処理を継続します。java.naming.security.authentication プロパティーが匿名バインドまたは簡単な認証を示す場合にだけ、このフェイルオーバー機構が使用されます。
例を示します。
env.put("java.naming.ldap.version", "2");
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 機構で必要な範囲情報を指定する文字列です。このプロパティーが設定されていない場合は、機構固有のデフォルトで、認証交換が使用されている間にクライアントとサーバー間でのネゴシエーションなどが行われます。
例を示します。
クライアントが認証に「webusers」の範囲を使用するように指定します。
env.put("java.naming.security.sasl.realm", "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 を参照) の要件を満たします。
例を示します。
これは、使用する SASL 機構のコールバックハンドラのインスタンスを提供します。
env.put("java.naming.security.sasl.callback", new MyCallbackHandler());
このプロパティーの値は、保護の品質 (qop) を「,」で区切ったリストで、クライアントの qop の設定を指定するために使用されます。qop 値は、次のいずれかです。リストの順序で、優先順位が決まります。このプロパティーが設定されない場合、デフォルトの qop 値は「auth」になります。
- auth - 認証のみ
- auth-int - 認証にと完全な保護
- auth-conf - 認証と、完全および機密の保護
このプロパティーの値は暗号の強さを示す値を「,」で区切ったリストで、クライアントの設定を指定するために使用されます。強さを表す値は、次のいずれかです。リストの順序で、優先順位が決まります。このプロパティーが設定されない場合、デフォルトの強さは「high,medium,low」になります。
- low
- medium
- high
DIGEST-MD5 内での機密性については、high が 3des へ、medium が rc4 または des へ、low が rc4-56 または rc4-40 へマッピングされます。
このプロパティーの値は、クライアントが受信する受信バッファーの最大サイズをバイト数で指定した整数の、文字列表現です。このプロパティーが設定されない場合、デフォルトのサイズは SASL 機構で定義されます。
このプロパティーの値は「true」または「false」のどちらかです。それぞれ、サーバーがクライアントに対して認証する必要の有無を指定します。このプロパティーが設定されない場合、デフォルトは「false」です。
このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL 機構がセッション間の転送機密性をサポートするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。
このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL 機構がクライアントのクレデンシャルを必要とするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。
このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL 機構を、単純で受動的な攻撃の影響を受けにくくするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。
このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL 機構を、能動的な (非ディクショナリ) 攻撃の影響を受けにくくするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。
このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL 機構を、ディクショナリ攻撃の影響を受けにくくするかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。
このプロパティーの値は「true」または「false」のどちらかです。それぞれ、選択した SASL 機構が匿名のログインを許可するかどうかを指定します。このプロパティーが設定されない場合、デフォルトは「false」です。
LDAP コンテキストに提供される名前は、常にそのコンテキストに対する相対的なものです。たとえば、「dc=widget,dc=com」に対して LDAP コンテキスト (lctx) が指定された場合、そのサブツリー内の LDAP エントリの命名には「dc=widget,dc=com」に対する相対名を使用する必要があります。たとえば、次の呼び出しは、「cn=John Smith,dc=widget,dc=com」エントリの属性を取得します。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
Attributes attrs = lctx.getAttributes("cn=John Smith");
同様に、列挙メソッド (Context.list、Context.listBindings、DirContext.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 サーバーと通信します。
LDAP プロバイダは、すべての属性値が String または byte[] オブジェクトとして入力されるものとみなし、すべての属性値を String または byte[] オブジェクトとして返します。どの属性値が byte[] とみなされるのか、およびそのリストの拡張方法については、java.naming.ldap.attributes.binary 環境プロパティーを参照してください。
認証情報は、URL の extensions 部で指定可能です。この形式の詳細については、RFC を参照してください。ldap://host:port/dn?attributes?scope?filter?extensions
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 のさまざまな個所で次のような役割を果たします。
検索メソッドを除き、LDAP URL または LDAPS URL を名前として初期コンテキストに渡す場合、URL にはどのようなクエリー (「?」) コンポーネントも含めません。クエリーコンポーネントを含めると、サービスプロバイダにより InvalidNameException がスローされます。検索メソッドの場合、URL のクエリーコンポーネントは引数として提供された対応するコンポーネントすべてをオーバーライドします。たとえば、スコープコンポーネントを含む LDAP URL が指定されると、そのスコープは SearchControls 引数内で渡されるすべてのスコープ設定をオーバーライドします。
Reference、Referenceable、および Serializable オブジェクトは、RFC 2713 に従って格納する必要があります。DirContext オブジェクトは、その属性を格納することにより格納されます。
RefAddr の参照リストを javaReferenceAddress 属性に格納する際に、アドレスの位置、型、および内容の区切り文字は、環境プロパティー java.naming.ldap.ref.separator を使って制御します。この環境プロパティーが指定されない場合、区切り文字としてハッシュ文字「#」が使用されます。
オブジェクトをディレクトリ内に格納する際、プロバイダは DirectoryManager.getStateToBind メソッドを使用します。これにより、どんな型のオブジェクトでも上記の 4 つのカテゴリの 1 つに変換して、ディレクトリ内に格納できるようになります。
スキーマツリーの内容を変更する権限は、ディレクトリ管理者により決定されます。スキーマツリーが変更されると、変更はディレクトリサーバーに格納されたスキーマに適用されます。
バインディング名 | バインディングの説明 |
---|---|
AttributeDefinition | 属性定義ツリーのルート: 名前または OID で識別される属性を持つ、フラットな名前空間 |
ClassDefinition | 「objectclass」定義ツリーのルート: 名前または OID で識別されるオブジェクトクラスを持つ、フラットな名前空間 |
SyntaxDefinition | 構文定義ツリーのルート: OID で識別される構文を持つ、フラットな名前空間 |
MatchingRule | 一致規則ツリーのルート: 名前または OID で識別される一致規則を持つ、フラットな名前空間 |
ExtensionDefinition | 拡張機能ツリーのルート: OID で識別される拡張機能を持つ、フラットな名前空間 |
ControlDefinition | コントロールツリーのルート: OID で識別されるコントロールを持つ、フラットな名前空間 |
SASLMechanism | SASL ツリーのルート: 文字列名で識別される SASL 認証機構を持つ、フラットな名前空間 |
基盤となるディレクトリがこの種のスキーマ情報を公開しない場合、またはサービスプロバイダがその取得をサポートしない場合には、これらのバインディングのいずれかまたはすべてが存在しないことがあり得ます。ただし、これらの名前がルートスキーマコンテキスト内に存在する場合には、上記の表に示したバインディングを保持する必要があります。
属性名およびこれらのエントリの属性の値は、大文字小文字で区別されません。
「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」属性を表すオブジェクトを取得できます。
その後、「cnSchema」DirContext オブジェクトの属性を取得すると、次のように表示されます。DirContext schema = ctx.getSchema(""); // get schema tree DirContext cnSchema = schema.lookup("AttributeDefinition/cn");
「cn」属性をすでに保持している場合には、「cnSchema」を取得するもう 1 つの方法があります。次のコードで、その方法を示します。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
Attributes attrs = ctx.getAttributes("cn=John", new String[]{"cn"}); Attribute cnAttr = attrs.get("cn"); DirContext cnSchema = cnAttr.getAttributeDefinition();
「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」オブジェクトクラスを表すオブジェクトを取得できます。
その後、「countrySchema」 DirContext オブジェクトの属性を取得すると、次のように表示されます。DirContext schema = ctx.getSchema(""); // get schema tree DirContext countrySchema = schema.lookup("ClassDefinition/country");
「country」オブジェクトを既に保持している場合、「countrySchema」を取得するもう 1 つの方法があります。次のコードで、その方法を示します。NUMERICOID 2.5.6.2 NAME country MAY aci, searchguide, description MUST objectclass, c DESC Standard ObjectClass SUP top
// 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() の仕様によると、サービスプロバイダがオブジェクトのオブジェクトクラス定義のいずれかを返すことになっています。オブジェクトは通常複数のオブジェクトクラスを保持すること、およびアプリケーションは実行中の動作に基づき、これらのオブジェクトクラスのいずれかに関する知識を必要とするため、この仕様は不適切です。上の例では、オブジェクトクラス定義をすべて含むコンテキストが返されます。
「SyntaxDefinition」コンテキスト内の各オブジェクトには、次のように必須属性とオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子 (OID) |
DESC | 構文の説明 |
これらの属性は、「SyntaxDescription」に対して RFC 2252 で定義された名前と一対一で対応します。属性値すべては、java.lang.String クラスにより表現されます。
たとえば、次のコードを使って、「1.3.6.1.4.1.1466.115.121.1.15」構文を表すオブジェクトを取得できます。
その後、「dirStringSchema」 DirContext オブジェクトの属性を取得すると、次のように表示されます。DirContext schema = ctx.getSchema(""); // get schema tree DirContext dirStringSchema = schema.lookup("SyntaxDefinition/1.3.6.1.4.1.1466.115.121.1.15");
その構文を保持する属性 (「country」属性など) を既に取得しているのであれば、「dirStringSchema」を取得する等価な方法が存在します。次のコードで、その方法を示します。NUMERICOID 1.3.6.1.4.1.1466.115.121.1.15 DESC Directory String
Attributes attrs = ctx.getAttributes("c=us", new String[]{"country"}); Attribute countryAttr = attrs.get("country"); DirContext dirStringSchema = countryAttr.getSyntaxAttributeDefinition();
一致規則が拡張可能な規則の場合、「APPLIES」属性も含んでいる必要があります。この属性は、この拡張可能な一致規則に適用可能な属性を一覧表示します。
「MatchingRule」コンテキスト内の各オブジェクトには、次のように必須属性とオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子 (OID) |
NAME | 一致規則の名前 |
DESC | 一致規則の説明 |
OBSOLETE | 現在使用されていない場合は「true」、その他の場合は「false」または値なし |
SYNTAX | この規則の適用対象の構文の数値 OID |
APPLIES | この拡張可能な一致規則の適用対象属性の型名のリスト |
これらの属性は、「MatchingRuleDescription」および「MatchingRuleUseDescription」に対して RFC2252 で定義された名前と一対一で対応します。属性値すべては、java.lang.String クラスにより表現されます。
たとえば、次のコードを使って「soundAlikeMatch」構文を表すオブジェクトを取得できます。
その後、「soundMatchSchema」 DirContext オブジェクトの属性を取得すると、次のように表示されます。DirContext schema = ctx.getSchema(""); // get schema tree DirContext soundMatchSchema = schema.lookup("MatchingRule/soundAlikeMatch");
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
「ExtensionDefinition」コンテキスト内の各オブジェクトには、次のように必須属性とオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子 (OID) |
DESC | 拡張機能の説明 |
属性値すべては、java.lang.String クラスにより表現されます。
たとえば、次のコードを使って、Start TLS 拡張機能 (「1.3.6.1.4.1.1466.20037」) を表すオブジェクトを取得できます。
その後、「startTLSSchema」 DirContext オブジェクトの属性を取得すると、次のように表示されます。DirContext schema = ctx.getSchema(""); // get schema tree DirContext startTLSSchema = schema.lookup("ExtensionDefinition/1.3.6.1.4.1.1466.20037");
NUMERICOID 1.3.6.1.4.1.1466.20037 DESC Start TLS (see RFC 2830)
「ControlDefinition」コンテキスト内の各オブジェクトには、次のように必須属性とオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子 (文字列) |
DESC | コントロールの説明 |
属性値すべては、java.lang.String クラスにより表現されます。
たとえば、次のコードを使って、サーバー側ソートコントロール (「1.2.840.113556.1.4.473」) を表すオブジェクトを取得できます。
その後、「svrSortSchema」 DirContext オブジェクトの属性を取得すると、次のように表示されます。DirContext schema = ctx.getSchema(""); // get schema tree DirContext svrSortSchema = schema.lookup("ControlDefinition/1.2.840.113556.1.4.473");
NUMERICOID 1.2.840.113556.1.4.473 DESC server-side sorting of search results
「SASLMechanism」コンテキスト内の各オブジェクトには、次のように必須属性とオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NAME (必須) | SASL 機構の名前 |
DESC | SASL 機構の説明 |
属性値すべては、java.lang.String クラスにより表現されます。
たとえば、次のコードを使って EXTERNAL SASL 機構を表すオブジェクトを取得できます。
その後、「saslExternalSchema」 DirContext オブジェクトの属性を取得すると、次のように表示されます。DirContext schema = ctx.getSchema(""); // get schema tree DirContext saslExternalSchema = schema.lookup("SASLMechanism/EXTERNAL");
NAME EXTERNAL
DESC EXTERNAL SASL mechanism (RFC 2222)
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.referral が ignore に設定される場合、またはエラー内容に照会が含まれない場合、PartialResultException をスローする。それ以外の場合、その内容を使用して照会を構築する |
referral (10) | java.naming.referral が ignore に設定された場合、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 |
LDAP エントリの指定されたサブツリー内で発生する命名イベントを受け取るリスナーを登録します。LDAP サーバーは、LDAP 操作応答に接続された LDAP コントロール、または LDAP 任意通知により、クライアントに対してイベントを通知します。この種の応答は LDAP プロバイダにより処理されてから、NamingEvent または UnsolicitedNotificationEvent の形でアプリケーションに渡されます。
コンテキストの環境プロパティーを更新します。複数のコンテキストが同じ環境プロパティーのセットを共有する場合、プロバイダは目的のコンテキストの環境だけを修正するよう注意する必要があります。環境プロパティーを変更すると、コンテキストが使用している既存の接続も変更しなければならない場合があります。
どんな環境プロパティーの場合でも、新たなプロパティーは、たとえそれがコンテキストに影響を与えない場合でも、記録されます。詳細は、「環境プロパティー」を参照してください。
プロバイダは、ディレクトリ内のオブジェクトのバインディングをサポートしない場合、OperationNotSupportedException をスローする必要があります。そうしないと、プロバイダがオブジェクトのバインディングをサポートしても提供されたオブジェクトをサポートしない場合、プロバイダは IllegalArgumentException をスローする必要があります。
LDAP 拡張操作を実行します。
要求された属性のリストが null であるか、または特別な属性識別子「*」を含む場合、LDAP エントリのユーザー属性すべてが返されます。操作属性が必要な場合、要求される属性リスト内にこれらの属性識別子が存在していなければなりません。
少なくとも、各エントリのクラス名を判別できるように、javaClassName 属性への問い合わせを実行します。クラス名を判別できない場合、クラス名として javax.naming.directory.DirContext を返します。
返される名前は、名前付きコンテキストに対する相対的な名前、または LDAP URL か LDAPS URL です。
返される名前は、名前付きコンテキストに対する相対的な名前、または LDAP URL か LDAPS URL です。
コンテキストの環境プロパティーを削除します。複数のコンテキストが同じ環境プロパティーのセットを共有する場合、プロバイダは目的のコンテキストの環境だけを修正するよう注意する必要があります。環境プロパティーを変更すると、コンテキストが使用している既存の接続も変更しなければならない場合があります。
命名イベントリスナーの登録解除を行い、そのリスナーを対象とするイベントがその後送信されないようにします。
このメソッドの動作に java.naming.ldap.deleteRDN プロパティーが与える影響に留意してください。
要求された属性のリストが null であるか、または特別な属性識別子「*」を含む場合、LDAP エントリのユーザー属性すべてが返されます。操作属性が必要な場合、要求される属性リスト内にこれらの属性識別子が存在していなければなりません。
オブジェクトを返すように要求されている場合、API ユーザーからの要求事項に加えて、Java オブジェクト関連の属性 (RFC 2713) も要求されます。これらの属性が存在する場合、その属性を使って元のオブジェクトが組み立てられます (「Java オブジェクト」を参照)。オブジェクトを RFC 2713 に従って再構築できない場合、LDAP エントリを表す DirContext オブジェクトを返します。プロバイダは、DirectoryManager.getObjectInstance メソッドを使用して、Binding.getObject メソッドへの呼び出し要件を満たす必要があります。
返される名前は、名前付きコンテキストに対する相対的な名前、または LDAP URL か LDAPS URL です。
提供する検索フィルタが適切に制限されている場合、プロバイダは LDAP 検索操作の代わりに LDAP 比較操作を使用できます。
文字列フィルタを引数として受け取る検索形式では、フィルタの構文は、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 内のオブジェクトは、次の方法で符号化する必要があります。
Java SASL API は Java Authentication and Authorization Service (JAAS) に依存しています。JAAS は、ユーザー/アプリケーション情報を直接取得または提供する必要のある 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」を参照してください。
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 の推奨に従って、プロバイダは識別名から検証対象のホスト名として抽出されたドメイン名を使用する必要があります。
JNDI アプリケーションは、ディレクトリ内で発生するイベント (エントリの追加または削除、エントリの変更など) を登録できます。アプリケーションは、任意通知も登録できます。
env.put(Context.SECURITY_PROTOCOL, "ssl");また、SSL をサポートする LDAP サーバーのホスト名とポート番号を選択しても、SSL を起動できます。SSL 接続がいったん確立されると、後続の LDAP プロトコル交換はその保護接続経由で行われます。
さらに、LDAP 認証も必要な場合には、java.naming.security.authentication、java.naming.security.principal、および java.naming.security.credentials 環境プロパティーを適切に設定する必要があります。LDAP 認証が必要で、かつ SSL クレデンシャルを LDAP 認証で再利用する必要がある場合には、次のように java.naming.security.authentication 環境プロパティーを設定して SASL EXTERNAL 機構を選択します。
env.put(Context.SECURITY_AUTHENTICATION, "EXTERNAL");