当对象名称中包含单引号或双引号时,如何为 java ldap 搜索 api 构造搜索过滤器

Min*_*ini 1 java ldap

cn=abc"and'def我在目录中有一个对象。我正在使用 Java 搜索 API:

public LDAPSearchResults search(java.lang.String base,
    int scope,
    java.lang.String filter,
    java.lang.String[] attrs,
    boolean typesOnly,
    LDAPSearchConstraints cons)
    throws LDAPException
Run Code Online (Sandbox Code Playgroud)

我尝试将搜索过滤器指定为abc"and'defabc\"and\'def。两者都返回:

错误的搜索过滤器

请帮助我了解当对象名称中包含单引号或双引号时如何构建搜索过滤器。

Ter*_*ner 5

整个 LDAP 搜索过滤器必须是有效的UTF-8字符串。有五 (5) 个值,如果它们出现在搜索过滤器中,则必须使用反斜杠\和要转义的字符的两位十六进制代码进行转义。必须转义的值为*()\和空字节0;因此,the"和 the'是搜索过滤器中合法且有效的字符。在像 Java 这样在字符之间包含字符串文字的语言中""作为字符串文字一部分出现的字符必须进行转义。

在一个示例中,您列出的过滤器\中带有反斜杠字符。必须在过滤器中使用反斜杠和反斜杠的十六进制代码对反斜杠进行转义,例如"(cn=abc\5c\"and'def)'"。在另一个示例中,您列出的过滤器"(cn=abc"and'def)"实际上是合法的搜索过滤器 - 忽略了内部"未转义的事实,因为它必须进行编译。

举例来说,我在本地主机的目录中创建了一个对象,dc=example,dc=com使用以下 LDIF 使用前缀或命名上下文侦听端口 1389:

dn: cn=abc"and'def,dc=example,dc=com
objectClass: top
objectClass: person
cn: abc"and'def
sn: whatever
Run Code Online (Sandbox Code Playgroud)

我编写了一个 Java 类来搜索该条目,如果找不到该条目,则会抛出断言错误:

import com.unboundid.ldap.sdk.Filter;
import com.unboundid.ldap.sdk.LDAPConnection;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldap.sdk.SearchScope;
import com.unboundid.ldap.sdk.SearchResult;

public final class BSFilter {
  public static void main(String... args) {
    try {
      Filter searchFilter =
        Filter.create("cn=abc\"and'def");
      LDAPConnection connection =
        new LDAPConnection("localhost",1389);
      SearchResult searchResult =
        connection.search("dc=example,dc=com",SearchScope.ONE,
                          searchFilter,"1.1");
      assert(searchResult.getSearchEntries().size() == 0);
    } catch(LDAPException lex) {
      lex.printStackTrace();
      return;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

该类按预期编译并抛出断言错误,因为它搜索的条目实际上存在。有关搜索过滤器的信息,请参阅RFC 4515 。使用的LDAPSDK是来自UnboundID的优秀SDK。请注意,该"字符在过滤器中被转义,以便该类能够编译,但这与过滤器文本本身无关。