我试图找出是否有人熟悉如何在搜索过滤器中使用二进制值来对抗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”字符串格式。这似乎有点hackish,虽然可能很慢,所以我想知道是否有一种API本地方式来进行二分类搜索。
感谢。
答案 0 :(得分:2)
如果你想为数据类型显示为二进制十六进制值的属性组合过滤器(相应的数据类型通常被称为'Octet String'),那就完全不同了。
如果要对这些二进制属性进行过滤,则必须声明必须以十六进制代码进行比较的每个字节。例如,如果搜索具有值为0x01AAF5EF的属性“Inventory”的对象,则必须读取相应的过滤器:
(Inventory=\01\aa\f5\ef)
不幸的是,搜索二进制属性时不允许使用通配符搜索!