このドキュメントで説明するすべての機能を、LDAP サービスプロバイダがサポートしなければならないわけではありません。ただし、ある機能をサポートする場合、そのサポート方法はこのドキュメントに説明された方法に従う必要があります。
LDAP サービスプロバイダに影響を及ぼす環境プロパティーには 4 つのタイプがあります。
特に、次のプロパティーのいずれかが環境プロパティー内で提供されていない場合、システムプロパティー、アプレットパラメータ、およびプロバイダとアプリケーションのリソースファイルの両方から、次に示す順序で検索されます。
コンテキストの環境プロパティーは、Context.getEnvironment メソッドを使用して検査できます。
コンテキストの環境プロパティーからあるプロパティーを削除する場合、コンテキストはそのプロパティーにはデフォルトの動作が割り当てられているものとみなします。ただし、プロパティーの値としてデフォルト値を指定しなければならないという意味ではありません。削除は、コンテキストの環境プロパティーにそのプロパティーが存在しないことによっても示されます。
このプロパティーの値は、サーバーから返される検索結果のバッチサイズを指定する 10 進数の文字列です。
このプロパティーは、Context.list、Context.listBindings、DirContext.search の各メソッドと、これらのメソッドが返す NamingEnumeration オブジェクトのブロック動作に影響を与えます。これは、返される列挙内の項目数には影響しません。LDAP プロトコルレベルで項目のバッチ処理または読み取りが行われる方法だけに影響を与えます。
値をゼロに設定すると、それは、すべての結果が受け取られるまでプロバイダがブロックすることを意味します。0 より大きい整数 n を設定することは、サーバーから n 個の結果が受信されるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法でプロバイダがブロックすべきであることを示します。アプリケーションが (NamingEnumeration.next または NamingEnumeration.nextElement を使用して) n 個の結果を読み取ったあと、プロバイダは、サーバーからさらに n 個の結果が受信されるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法で読み取るべきです。
このプロパティーが設定されない場合、デフォルト値は実装固有の値になります。
たとえば、次のコードは、サーバーから 24 個のエントリが読み取られるか、または列挙が終了するか、どちらか生成される結果の数が少ない方の方法でプロバイダがブロックすべきであることを指定します。
env.put(Context.BATCHSIZE, "24");
このプロパティーの値は、コントロールファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。
ファクトリは、応答コントロールを行うクラスのナロー変換を行います。これらのファクトリは、プロバイダが生成する一般的な応答コントロールから固有の応答コントロールを作成します。
このプロパティーのデフォルト値は定義されていません。
たとえば、次のコードは、ResponseControlFactory クラスを試行対象のコントロールファクトリとして設定します。
env.put(LdapContext.CONTROL_FACTORIES, "com.sun.jndi.ldap.ctl.ResponseControlFactory");
このプロパティーの値は、LDAP サービスプロバイダの初期コンテキストを作成するファクトリクラスの完全修飾されたクラス名です。
これは、特定の LDAP サービスプロバイダを選択するために使用します。プロバイダ自身が使用することはありません。初期コンテキストメソッドへの名前引数が URL である場合には、このプロパティーを設定する必要はありません。
このプロパティーのデフォルト値は定義されていません。
たとえば、次のコードは、Sun の LDAP プロバイダを選択します。
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
このプロパティーの値は、オブジェクトファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。
ファクトリは、プロバイダから返された LDAP エントリから特定のオブジェクトを作成します。たとえば、Person オブジェクトファクトリが、オブジェクトクラス person の LDAP エントリから Person オブジェクトを生成するとします。オブジェクトファクトリは、LDAP 属性からオブジェクトを生成するという点で、状態ファクトリとは反対の動作を行います。
このプロパティーのデフォルト値は定義されていません。
次に例を示します。
env.put(Context.OBJECT_FACTORIES, "com.sun.jndi.ldap.obj.PersonFromLDAP");これは、PersonFromLDAP クラスを試行対象のオブジェクトファクトリとして設定します。
このプロパティーの値は、状態ファクトリクラスの完全修飾されたクラス名をコロンで区切ったリストです。
このファクトリは、オブジェクト自体からオブジェクトの状態 (格納用) を作成します。たとえば、Person 状態ファクトリが、Person オブジェクトからオブジェクトクラス person の LDAP エントリを生成するとします。状態ファクトリは、オブジェクトから LDAP 属性を生成するという点で、オブジェクトファクトリとは反対の動作を行います。
このプロパティーのデフォルト値は定義されていません。
次に例を示します。
env.put(Context.STATE_FACTORIES, "com.sun.jndi.ldap.obj.PersonToLDAP");
これは、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 サーバーのホスト名とポートを決定し、接続が正常に確立された場合は、接続に成功したホスト名、ポート、および識別名を使用して、構築された URL に java.naming.provider.url プロパティーを設定します。また、プロバイダが URL にあるその他の情報をどのように扱うべきかについても、「URL」を参照してください。
たとえば、
env.put(Context.PROVIDER_URL, "ldap://secserver:636");これは、LDAP サーバーが secserver という名前のホストのポート 636 で動作していることを示します。
注: Context.addToEnvironment または Context.removeFromEnvironment メソッドを使用してこのプロパティーを変更しても、コンテキストには影響を与えません。このプロパティーを使用するのは、初期コンテキストコンストラクタだけです。
このプロパティーの値は、プロバイダが照会を処理する方法を指定する文字列です。次の値は、このプロパティー用に定義されたものです。
1 つの照会エントリで検出された複数の URL を処理する方法については、「URL」を参照してください。
このプロパティーが設定されていない場合、そのデフォルト値は ignore です。
たとえば、
env.put(Context.REFERRAL, "throw");
このプロパティーの値は、使用するプロバイダ用の認証メカニズムを指定する文字列です。次の値は、このプロパティー用に定義されたものです。
このプロパティーを SASL 認証に使用する方法については、「SASL」を参照してください。LDAP 認証メカニズムについては、RFC 2829 を参照してください。
このプロパティーが設定されていない場合、java.naming.security.credentials プロパティーが設定されていないかぎり、そのデフォルト値は none です。設定されている場合、デフォルト値は simple です。このプロパティーが、プロバイダで認識またはサポートされない値に設定されている場合は、AuthenticationNotSupportedException がスローされます。
たとえば、
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5 CRAM-MD5");
env.put(Context.SECURITY_CREDENTIALS, "secret");
このプロパティーの値は、認証対象のプリンシパルのアイデンティティーを指定する文字列です。その形式は、認証タイプによって異なります。詳細は、RFC 2829 を参照してください。この値は、SASL 以外の認証のための LDAP ASN.1 BindRequest 内の name コンポーネントとして使用されます。SASL 認証の場合、このプロパティーの値は、認証 ID を必要とする SASL メカニズムの認証 ID として使用されます。
プロバイダが、プリンシパル名の有効性を検証する必要はありません。プロバイダは、たとえば、サーバーにより検証される文字列を渡すなどの処理を行うだけです。識別されたプリンシパルが有効なプリンシパルでない場合、プロバイダは AuthenticationException をスローします。
このプロパティーのデフォルト値は定義されていません。
たとえば、
env.put(Context.SECURITY_PRINCIPAL, "cn=admin,o=sun,c=us");
これは、プリンシパル名として識別名「cn=admin, o=sun, c=us」を設定します。
このプロパティーが 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 2256 |
userCertificate | 2.5.4.36 | RFC 2256 |
cACertificate | 2.5.4.37 | RFC 2256 |
authorityRevocationList | 2.5.4.38 | RFC 2256 |
certificateRevocationList | 2.5.4.39 | RFC 2256 |
crossCertificatePair | 2.5.4.40 | RFC 2256 |
x500UniqueIdentifier | 2.5.4.45 | RFC 2256 |
env.put("java.naming.ldap.control.connect", new Control[]{ new ManageReferralControl(true) });
たとえば、
env.put("java.naming.ldap.deleteRDN", "false");
このプロパティーの値は、検索操作中に別名を間接参照する方法を指定する文字列です。次の値は、このプロパティー用に定義されたものです。
env.put("java.naming.ldap.derefAliases", "searching");
注: このプロパティーは、SearchControls オブジェクト内の間接参照リンクフラグとは関係ありません。
env.put("java.naming.ldap.factory.socket", "javax.net.ssl.SSLSocketFactory");
env.put("java.naming.ldap.ref.separator", ":");
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 メカニズムで必要な範囲情報を指定する文字列です。
このプロパティーが設定されていない場合は、メカニズム固有のデフォルトで、認証交換が使用されている間にクライアントとサーバー間でのネゴシエーションなどが行われます。
たとえば、
env.put("java.naming.security.sasl.realm", "webusers");
クライアントが認証に「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 プロパティーの値を使用して (Java SASL API で説明されている) RealmCallback と RealmChoiceCallback の要件を満たすデフォルトのコールバックハンドラを使用します。
たとえば、
env.put("java.naming.security.sasl.callback", new MyCallbackHandler());
これは、使用する SASL メカニズムのコールバックハンドラのインスタンスを提供します。
このプロパティーの値は、クライアントの保護の品質 (qop) 設定を指定するために使用される、qop 値の「,」で区切られたリストです。qop 値は、次のいずれかです。
このプロパティーの値は、クライアントの設定を指定するために使用される、暗号強度値の「,」で区切られたリストです。強さを表す値は、次のいずれかです。
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」エントリの属性を取得します。
Attributes attrs = lctx.getAttributes("cn=John Smith");
同様に、コンテキストが列挙メソッド (Context.list、Context.listBindings、DirContext.search) のいずれかを使用して列挙されている場合、ターゲットコンテキスト (列挙されているコンテキスト) に対する相対名が返されます。参照が呼び出されると、相対名の代わりに、完全修飾名を含む LDAP または LDAP URL 文字列が返されます。(列挙がプレーン接続を使用して実行された場合は 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[] オブジェクトのどちらかとして予測し、出力でもこのどちらかとして返します。どの属性値が byte[] として処理されるか、およびそのリストを拡張する方法については、java.naming.ldap.attributes.binary 環境プロパティーを参照してください。
ldap://host:port/dn?attributes?scope?filter?extensions
認証情報は、URL の extensions 部分で指定できます。この形式の詳細については、RFC を参照してください。
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 または 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 で定義されている名前と 1 対 1 で対応します。属性値はすべて java.lang.String クラスによって表現されます。
たとえば、次のコードを使って「cn」属性を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext cnSchema = schema.lookup("AttributeDefinition/cn");
次に「cnSchema」DirContext オブジェクトの属性を取得すると、次のように表示されます。
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
「cn」属性をすでに保持している場合には、「cnSchema」を取得するもう 1 つの方法があります。次のコードで、その方法を示します。
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 で定義されている名前と 1 対 1 で対応します。属性値はすべて java.lang.String クラスによって表現されます。
たとえば、次のコードを使って「country」オブジェクトクラスを表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext countrySchema = schema.lookup("ClassDefinition/country");
次に「countrySchema」DirContext オブジェクトの属性を取得すると、次のように表示されます。
NUMERICOID 2.5.6.2 NAME country MAY aci, searchguide, description MUST objectclass, c DESC Standard ObjectClass SUP top
「country」オブジェクトをすでに保持している場合、「countrySchema」を取得するもう 1 つの方法があります。次のコードで、その方法を示します。
// 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");
注: getSchemaClassDefinition() の JNDI 1.1 の仕様には、サービスプロバイダはオブジェクトのオブジェクトクラス定義のいずれかを返すことになっています。オブジェクトは通常複数のオブジェクトクラスを保持すること、およびアプリケーションは実行中の動作に基づき、これらのオブジェクトクラスのいずれかに関する知識を必要とするため、この仕様は不適切です。上の例では、オブジェクトクラス定義をすべて含むコンテキストが返されます。
「SyntaxDefinition」コンテキスト内の各オブジェクトには、次の必須およびオプション属性があります。
属性識別子 | 属性値の説明 |
---|---|
NUMERICOID (必須) | 一意の識別子 (OID) |
DESC | 構文の説明 |
これらの属性は、「SyntaxDescription」に対して RFC 2252 で定義されている名前と 1 対 1 で対応します。属性値はすべて java.lang.String クラスによって表現されます。
たとえば、次のコードを使って、「1.3.6.1.4.1.1466.115.121.1.15」構文を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext dirStringSchema = schema.lookup("SyntaxDefinition/1.3.6.1.4.1.1466.115.121.1.15");
次に「dirStringSchema」DirContext オブジェクトの属性を取得すると、次のように表示されます。
NUMERICOID 1.3.6.1.4.1.1466.115.121.1.15 DESC Directory String
その構文を保持する属性 (「country」属性など) をすでに取得しているのであれば、「dirStringSchema」を取得する等価な方法が存在します。次のコードで、その方法を示します。
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」に対して RFC 2252 で定義されている名前と 1 対 1 で対応します。属性値はすべて java.lang.String クラスによって表現されます。
たとえば、次のコードを使って「soundAlikeMatch」構文を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext soundMatchSchema = schema.lookup("MatchingRule/soundAlikeMatch");
次に「soundMatchSchema」DirContext オブジェクトの属性を取得すると、次のように表示されます。
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」) を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext startTLSSchema = schema.lookup("ExtensionDefinition/1.3.6.1.4.1.1466.20037");
次に「startTLSSchema」DirContext オブジェクトの属性を取得すると、次のように表示されます。
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」) を表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext svrSortSchema = schema.lookup("ControlDefinition/1.2.840.113556.1.4.473");
次に「svrSortSchema」DirContext オブジェクトの属性を取得すると、次のように表示されます。
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 メカニズムを表すオブジェクトを取得できます。
DirContext schema = ctx.getSchema(""); // get schema tree DirContext saslExternalSchema = schema.lookup("SASLMechanism/EXTERNAL");次に「saslExternalSchema」DirContext オブジェクトの属性を取得すると、次のように表示されます。
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 |
コンテキストの環境プロパティーを更新します。複数のコンテキストが同じ環境プロパティーのセットを共有する場合、プロバイダは目的のコンテキストの環境だけを修正するよう注意する必要があります。環境プロパティーを変更すると、コンテキストが使用している既存の接続も変更しなければならない場合があります。
コンテキストの環境プロパティーを削除します。複数のコンテキストが同じ環境プロパティーのセットを共有する場合、プロバイダは目的のコンテキストの環境だけを修正するよう注意する必要があります。環境プロパティーを変更すると、コンテキストが使用している既存の接続も変更しなければならない場合があります。
引数として文字列フィルタを受け入れる検索の形式では、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 の概念をサポートしています。java.naming.security.sasl.authorizationId プロパティーが設定されている場合は、その値が認証 ID として使用されます。設定されていない場合は空の文字列が認証 ID として使用されます。これによって、サーバーはクライアントの認証資格から認証 ID を作成します。
SASL をサポートするために LDAP サービスプロバイダによって使用されるプロパティーについては、「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 ネゴシエーションのあとにホスト名の検証を実行するべきです。DNS の情報を使用して LDAP サーバーが自動的に検出された場合 (「URL」を参照)、draft-ietf-ldapext-locate-08.txt で推奨されているように、プロバイダは識別名から派生されたドメイン名をホスト名として使用して検証するべきです。
JNDI アプリケーションは、ディレクトリ内で発生するイベント (エントリの追加または削除、エントリの変更など) を登録できます。アプリケーションはまた、非要請通知も登録できます。
このプロバイダは、Java Secure Socket Extension (JSSE) 仕様に従って SSL をサポートします。SSL は、java.naming.security.protocol 環境プロパティーを次のように設定することによって起動できます。
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 認証に再利用する必要がある場合は、次のように、SASL EXTERNAL メカニズムを選択するように java.naming.security.authentication 環境プロパティーを設定します。
env.put(Context.SECURITY_AUTHENTICATION, "EXTERNAL");