Spring ldapTemplate search() 不返回 dn 属性

问题描述 投票:0回答:1

我有一个相当简单的程序,它基于 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 的见解都会很有帮助。

spring spring-boot ldap spring-ldap
1个回答
0
投票

条目 DN 不是属性。它的格式只是类似于 LDIF 格式文本输出中的属性,但实际上是实际 LDAP 响应中的一个单独的“对象名称”字段,并且通常通过 LDAP 客户端库中的单独变量公开。 在Spring LDAP中,似乎需要使用返回结果的

.getDn()

方法。

    

© www.soinside.com 2019 - 2024. All rights reserved.