【问题标题】:Spring LDAP search with organisational units returns zero results具有组织单位的 Spring LDAP 搜索返回零结果
【发布时间】:2016-04-13 07:19:09
【问题描述】:

我正在开发一个普通的 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 以字符串形式返回 distinctName,UserAttributesMapper 返回来自不同属性的用户对象,例如 sAMAccountNamegivenName

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

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

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

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

这不可能是由于错误的组专有名称、“memberof”不起作用或组不包含用户,因为我测试了查找:

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=example,DC=test,DC=org CN=import_users,CN=Users,DC=example,DC=test,DC=org

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

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

【问题讨论】:

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


    【解决方案1】:

    魔鬼在细节中: 群成员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=example,DC=test,DC=org

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

    【讨论】:

    • 是的,这似乎至少是部分答案-用户和组似乎在CN=Users,DC=example,DC=test,DC=org中-这就是递归也起作用的原因,因为子组也有像CN=subgroup,CN=Users,DC=example,DC=test,DC=org这样的dn .广告树和遍历它与我想象的不同……但这应该也适用于其他广告系统,所以现在我遇到了一堆新问题,可能不得不放弃当前的遍历方法。
    • 由于您从组成员属性中获得了用户的完整 DN,因此您只需 lookup() 该 DN 即可找到该用户。
    • 是的,这是旧的方法:一个接一个地查找可能成千上万的用户和多个组,但速度很慢 - 这种用户获取应该可以工作,例如。每晚一次。我尝试了一个新的解决方案,将基础裁剪为仅DC=example,DC=test,DC=org,并使用与以前完全相同的过滤器搜索组/用户的子树范围 - 似乎至少在测试环境案例中有效。
    • 这应该可行,但在这种情况下您需要注意服务器限制:AD 服务器通常会将 LDAP 搜索返回的元素数量限制在相对较低的数量(例如1000)。如果搜索返回超过此限制,它将引发异常(除非您使用分页,这在 LDAP 中完全没有希望)。您的服务器管理员应该能够向您提供有关此类限制是否有效的信息。
    猜你喜欢
    • 2015-05-25
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多