从 LDAP 检索数据

Retrieving data from LDAP

我想从 LDAP 服务器获取数据。我可以从列表中检索所有用户。但是现在,我想要做的是获取 'directReports' 属性下的人员列表。它 returns 用户作为 java 对象。我无法将它们转换为 toString() 以外的任何类型。我所做的是将对象转换为字符串并使用字符串操作来获取用户的姓名。但我认为这不是执行此操作的正确方法。请给我一个建议。谢谢!


        @Override
        public Object mapFromAttributes(Attributes attributes) throws NamingException {
            List<LdapUserDetail> ldapUserDetails = new ArrayList<>();
            Attribute directReports = attributes.get("directReports");

            NamingEnumeration ne = directReports.getAll();
            while(ne.hasMore()){
                try {
                    Object item = ne.next();
                    String emp = item.toString();
                    emp = Arrays.stream(emp.split(",")).filter(name -> name.startsWith("CN")).collect(Collectors.toList()).get(0).split("CN")[1];
                    LdapUserDetail ldapUserDetail = new LdapUserDetail();
                    ldapUserDetail.setName(emp);;
                    ldapUserDetails.add(ldapUserDetail);
                } catch (Exception e){
                    e.printStackTrace();
                }

            }
            logger.info("checklist "+ldapUserDetails.size());
            return ldapUserDetails;
        }
    } ```

在 LDAP 中,directReports 属性 (==field) 是 可分辨名称 (DN) 类型。那是指向数据库中另一个对象的指针,在本例中是一个用户。当你在 Java 中读取它时,你会得到一个字符串列表。

通常,DN 的格式为 CN=username,OU=department,O=organization。 CN 在某些实现中也可能是 UID。如果 CN 是您想要的,那么只需使用两个 split() 命令解析 DN 字符串值即可:

// We take off at your line
String emp = item.toString();
String[] dnParts = emp.split(",");
String cnValue = dnParts[0].split("=")[1];

明智的做法是对介于两者之间的 null 个值进行完整性检查。

如果您想检索有关 DN 值指向的用户的其他详细信息,您将需要在第二个操作中从 LDAP 读取该对象(LDAP 读取速度非常快):

// We take off at your line
String emp = item.toString();
// Create controls for the LDAP operation
SearchControls ctrl = new SearchControls();
// Tell LDAP this is a read
ctrl.setSearchScope(SearchControls.OBJECT_SCOPE);
// Request all attributes for this object
ctrl.setReturningAttributes(new String[] {"*", "+"});
// I assume you have an LdapContext object called ctx
NamingEnumeration<SearchResult> results = ctx.search(emp, "objectclass=*", controls);
while (results.hasMore())
{
    // This is your user object with all its attributes
    SearchResult result = results.next(); 
    // Always close the enumeration to prevent memory leaks
    results.close();
    break;
}