Active directory 使用组织单位的SpringLDAP搜索返回零结果

Active directory 使用组织单位的SpringLDAP搜索返回零结果,active-directory,spring-ldap,ldap-query,ou,Active Directory,Spring Ldap,Ldap Query,Ou,我正在开发一个普通的java命令行软件,它使用SpringLDAP执行递归LDAP搜索,从指定的组开始,搜索指定组和子组中的所有用户 如果组专有名称包含组织单位(=ou),则搜索无法找到任何内容,但在其他情况下有效 以下是实现的简短版本,省略了递归: private void searchLdapGroup(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName) { // recursion guar

我正在开发一个普通的java命令行软件,它使用SpringLDAP执行递归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);       
}
发现

CN=johndoe,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=导入用户,OU=测试OU,DC=示例,DC=测试,DC=组织 CN=导入用户,CN=用户,DC=示例,DC=测试,DC=组织

当涉及组织单位时,为什么搜索没有找到任何东西

图书馆用户:
spring ldap核心-2.0.4.发布版魔鬼在细节中: 组成员
CN=import\u users,OU=testou,DC=example,DC=test,DC=org

CN=johndoe,CN=Users,DC=example,DC=test,DC=org

但您似乎正在搜索下的用户

OU=testou,DC=example,DC=test,DC=org


也就是说,似乎所有用户都在
CN=users,DC=example,DC=test,DC=org
下,但当您实际搜索用户时,您假设他们是相对于组放置的。

是的,这似乎至少是一个部分答案-用户和组似乎在
CN=users,DC=example,DC=test,DC=org
-这就是递归也起作用的原因,因为子组也有dn,如
CN=subgroup,CN=Users,DC=example,DC=test,DC=org
。ad树和遍历它与我所想的不同…但这也适用于其他ad系统,因此现在我遇到了一系列新问题,可能不得不放弃当前的遍历方法。由于您从group member属性中获得了用户的完整DN,您可以简单地
lookup()
该DN用于查找用户。是的,这是一种老方法:逐个查找数千个用户和多个组,但速度很慢,而且该用户抓取应该可以工作,例如每晚一次。我尝试了一个新的解决方案,将基础裁剪为仅
DC=example,DC=test,DC=org
,并使用与以前完全相同的筛选器搜索组/用户的子树范围-至少在测试环境中似乎是可行的。这可能会起作用,但在这种情况下,您需要注意服务器限制:广告服务器通常将LDAP搜索返回的元素数量限制在相对较低的数量(例如1000个)。如果搜索返回的值超过此限制,它将抛出一个异常(除非您使用分页,这在LDAP中是完全没有希望的)。服务器管理员应该能够向您提供有关此限制是否有效的信息。
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");
        }
    });