gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:39:37 25 4
gpt4 key购买 nike

我有一个对象,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

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

Bad search filter

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

最佳答案

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

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

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

dn: cn=abc"and'def,dc=example,dc=com
objectClass: top
objectClass: person
cn: abc"and'def
sn: whatever

我编写了一个 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;
}
}
}

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

关于java - 当对象名称中包含单引号或双引号时,如何为 java ldap 搜索 api 构造搜索过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6839773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com