使用组织单位的Spring LDAP搜索返回零结果

时间:2016-04-13 07:19:09

标签: active-directory spring-ldap ldap-query ou

我正在使用普通的java命令行软件,该软件使用Spring LDAP执行递归LDAP搜索,从指定的组开始并搜索指定组和子组中的所有用户。

如果组专有名称包含组织单位(= ou),则搜索无法找到任何内容,但在其他情况下有效。

这是实现的简短版本,省略了递归:

private void searchLdapGroup(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName) {
    // recursion guard omitted
    String base = groupName.substring(groupName.indexOf(',') + 1);
    AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "group")).and(new EqualsFilter("memberof", groupName));
    List<String> subgroups = ldapTemplate.search(base, filter.encode(), new GroupNameMapper());

    // recursive calls for subgroups omitted
    getAllUsers(users, ldapTemplate, groupName, base);
}

private void getAllUsers(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName, String base) {
    AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "person")).and(new EqualsFilter("memberof", groupName));
    // Paged search omitted.
    List<UserDTO> result = ldapTemplate.search(base,filter.encode(),new UserAttributesMapper());
    users.addAll(result);       
}

GroupNameMapper将distinguishedName作为字符串返回,UserAttributesMapper返回来自sAMAccountNamegivenName等不同属性的用户对象。

代码(带递归)查找第一个测试组中的所有36个用户,其中指定的组如下:

  

CN = import_users,CN =用户,DC =例如,DC =测试,DC =组织

在相同的测试环境中,当组专有名称包含一个或多个组织单位时,它返回零个人和子组,例如

  

CN = import_users,的 OU = testou 下,DC =例如,DC =测试,DC =组织

这可能是由于错误的群组专有名称,&#34;成员&#34;不工作或不包含用户的组,因为我测试了查找:

String[] test = (String[])ldapTemplate.lookup("CN=import_users,OU=testou,DC=example,DC=test,DC=org", new ContextMapper() {
        public Object mapFromContext(Object ctx) {
            DirContextAdapter adapter = (DirContextAdapter) ctx;
            return adapter.getStringAttributes("Member");
        }
 });

找到

  

CN = John Doe,CN = Users,DC = example,DC = test,DC = org

并查找用户John Doe

String[] test = (String[])ldapTemplate.lookup("CN=John Doe,CN=Users,DC=example,DC=test,DC=org", new ContextMapper() {
        public Object mapFromContext(Object ctx) {
            DirContextAdapter adapter = (DirContextAdapter) ctx;
            return adapter.getStringAttributes("memberof");
        }
    });

给出结果:

  

CN = import_users,OU = testou,DC =例如,DC =测试,DC =组织   CN = import_users,CN =用户,DC =例如,DC =测试,DC =组织

如果涉及组织单位,搜索怎么找不到?

图书馆用户: spring-ldap-core - 2.0.4.RELEASE

1 个答案:

答案 0 :(得分:0)

魔鬼在细节中: 小组CN=import_users,OU=testou,DC=example,DC=test,DC=org的成员是

  

CN = John Doe,CN = Users,DC = example,DC = test,DC = org

但您似乎在

下搜索用户
  

OU = testou,DC =例如,DC =测试,DC =组织

也就是说,似乎所有用户都在CN=Users,DC=example,DC=test,DC=org下,但当您实际搜索用户时,您会认为他们是相对于该群组的。