2

我试图找出是否有人熟悉如何在搜索过滤器中针对 LDAP 中的 userCertificate 属性使用二进制值。我知道如何使用旧的 JNDI API 来做到这一点,但我很好奇是否有人可以帮助我在 Netscape Directory SDK (netscape.ldap) 中解决这个问题。

JNDI API 示例:

byte[] userCert = Base64.decodeBase64(base64Certificate);
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapURL);
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);
InitialDirContext context = new InitialDirContext(env);
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setReturningAttributes(fetchArray);
Enumeration<SearchResult> results = context.search(baseDN, "userCertificate={0}", new Object[] {userCert}, controls);

想做的是使用以下 API,但是上面的代码没有得到任何结果:

byte[] userCert = Base64.decodeBase64(base64Certificate);
LDAPConnection ld = new LDAPConnection();
ld.connect(ldapURL, ldapPort);

ld.authenticate(username, password);

LDAPSearchResults results = ld.search(baseDN, LDAPConnection.SCOPE_SUB, "(userCertificate;binary=" + base64Certificate + ")",
                fetchArray, false);

我尝试使用/不使用 ;binary 修饰符,并尝试了二进制和 base64 值。但是,如果我编写一个自定义方法将字节数组转换为“\xx”字符串格式,那么会起作用这似乎有点骇人听闻,而且可能很慢,所以我想知道是否有一种 API-native 方式来进行这样的二进制搜索。

谢谢。

4

1 回答 1

2

如果您想为数据类型显示为二进制十六进制值(相应的数据类型通常称为“八进制字符串”)的属性编写过滤器,那将是完全不同的事情。

如果要过滤此类二进制属性,则必须声明必须以十六进制代码进行比较的每个字节。例如,如果您搜索属性为“Inventory”且值为 0x01AAF5EF 的对象,则相应的过滤器必须为:

(Inventory=\01\aa\f5\ef)

不幸的是,搜索二进制属性时不允许使用通配符搜索!

试试这个链接了解更多

于 2013-02-03T21:59:41.480 回答