4

LDAP ディレクトリ サーバーに対していくつかのクエリを実行する必要があり、そのために JNDI ディレクトリ機能を使用しています。次に、識別名を使用してクエリ結果からオブジェクトを処理する必要があります。サーバーから返されるエントリの一部にはスラッシュ文字が含まれています。このため、JNDI は名前全体を二重引用符でエスケープします。

NamingEnumeration<SearchResult> results = dirContext.search(queryRoot, queryFilter, controls);
for (SearchResult result : Collections.list(results)) {
    String objectName = result.getName();
    System.out.println(objectName);
}

クエリ結果のオブジェクトの 1 つに名前 (たとえば、'b=id/10,a=1') がある場合、次のように出力されます。

"b=id/10,a=1"

名前の前後の二重引用符に注意してください。これらの引用符があるため、直接作成することはできません。「無効な名前」javax.naming.ldap.LdapNameで失敗します。NamingException

これらの引用符を手動で削除できることは理解していますが、これはハッキリしています。そのようなエスケープを回避する方法はありますか? または、必要なことを行うためのよりクリーンな方法がありますか?

PS公式のJNDIチュートリアルが「簡単な名前操作」を実現するために使用することを提案しLdapName、エスケープの問題についても言及しているのに、上記の問題に関するリンクを提供していないのは面白いです。

4

2 に答える 2

2

に LDAP 固有の構文がある場合AttributeValue、文字は (定義された構文仕様を使用して) UTF-8 に変換され、次の文字のみをエスケープする必要があります。

  • ' '(スペース) 文字列の先頭に
  • ' '(スペース) 文字列の末尾に
  • '"'
  • '+'(プラス文字は複数値の RDN を示します)
  • ,(コンマ文字は、識別名の構成要素を区切ります)
  • ;
  • <
  • >
  • \

スラッシュは有効な文字であり、エスケープする必要はありません。したがって、アプリケーションおよびそのアプリケーションで使用される API で処理する必要があります。ご指摘のとおり、スラッシュには JNDI にとって「特別な意味」があります。JNDI は多くの点で設計が不十分です。これは多くの点の 1 つにすぎません。新しいコードにはUnboundID LDAP SDKの使用を検討してください。

たとえば、次のエントリを追加します。

dn: uid=abc/def,ou=people,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: inetOrgPerson
uid: abc/def
cn: abc/def
sn: abc/def
userPassword: this entry is used to test http://stackoverflow.com/questions/11690529/forward-slashes-in-the-names-returned-by-jndi-query-to-ldap-server

追加したエントリを取得します。

ldapsearch -h localhost -p 10389 -D 'cn=RootDn'  -b dc=example,dc=com -s sub '(uid=abc/def)' 1.1
Enter bind password: 
version: 1
dn: uid=abc/def,ou=people,dc=example,dc=com

こちらもご覧ください

于 2012-07-28T11:17:58.357 に答える