我有一个相当简单的程序,它基于 CN 执行 LDAP 搜索并映射所有返回的属性,这是该程序:
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import org.springframework.ldap.core.AttributesMapper;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;
import org.springframework.ldap.query.ConditionCriteria;
import org.springframework.ldap.query.ContainerCriteria;
import static org.springframework.ldap.query.LdapQueryBuilder.query;
import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
public class LDAPSearchTest {
public static void main(String[] args) {
LdapContextSource contextSource = new DefaultSpringSecurityContextSource("ldaps://localhost:636");
contextSource.setUserDn("");
contextSource.setPassword("");
contextSource.setAnonymousReadOnly(false);
contextSource.afterPropertiesSet();
LdapTemplate ldapTemplate = new LdapTemplate(contextSource);
ConditionCriteria condition
= query()
.base("baseDNValue")
.where("cn");
ContainerCriteria filter = condition.is("cnValue");
List<Map<String, List<Object>>> results = ldapTemplate.search(
filter,
new DefaultAttributesMapper());
for (Map<String, List<Object>> groupSearchResult : results) {
for (String attributeName : groupSearchResult.keySet()) {
System.out.println(String.format("\t%s", attributeName));
for (Object attributeValue : groupSearchResult.get(attributeName)) {
System.out.println(String.format("\t\t%s", attributeValue == null ? null : attributeValue.toString()));
}
}
}
}
private static class DefaultAttributesMapper implements AttributesMapper<Map<String, List<Object>>> {
@Override
public Map<String, List<Object>> mapFromAttributes(Attributes attributes) throws NamingException {
Map<String, List<Object>> mappedAttributes = new LinkedHashMap<>();
NamingEnumeration<? extends Attribute> attributesEnumeration = attributes.getAll();
while (attributesEnumeration.hasMore()) {
Attribute nextAttribute = attributesEnumeration.next();
mappedAttributes.put(nextAttribute.getID(), new ArrayList<>());
NamingEnumeration attributeValuesEnumeration = nextAttribute.getAll();
while (attributeValuesEnumeration.hasMore()) {
Object nextAttributeValue = attributeValuesEnumeration.next();
mappedAttributes.get(nextAttribute.getID()).add(nextAttributeValue);
}
}
return mappedAttributes;
}
}
}
由于某种原因,属性
dn
不包含在返回属性列表中,但其他所有属性都包含(据我所知)。 当我使用 ldapsearch
进行等效搜索时,结果中会返回 dn
属性。 任何关于为什么我无法从 Java 代码检索 dn 的见解都会很有帮助。
条目 DN 不是属性。它的格式只是类似于 LDIF 格式文本输出中的属性,但实际上是实际 LDAP 响应中的一个单独的“对象名称”字段,并且通常通过 LDAP 客户端库中的单独变量公开。 在Spring LDAP中,似乎需要使用返回结果的
.getDn()
方法。