java - 通过Java查找嵌套组中的LDAP用户

标签 java active-directory ldap

我发现没有任何东西对我有用。而且我无法找到具有有效代码的答案,而不仅仅是从其他网站粘贴搜索过滤器字符串。

尝试进行搜索的相关代码是:

SearchResult sr = executeSearchSingleResult(ctx, SearchControls.SUBTREE_SCOPE, "dc=mydomain,dc=local", "(&(objectClass=person)(sAMAccountName=admin2))", new String[]{"memberOf"});
if (sr != null) {
    Attribute memberOf = sr.getAttributes().get("memberOf");
    if (memberOf != null) {
        for (int i = 0; i < memberOf.size(); i++) {
            Attributes attributes = ctx.getAttributes(memberOf.get(i).toString(), new String[]{"CN"});
            Attribute attribute = attributes.get("CN");
            if (attribute != null) {
                log.info("member of : " + attribute.get(0));
            }
        }
        for (Enumeration e1 = memberOf.getAll(); e1.hasMoreElements();) {
            String unprocessedGroupDN = e1.nextElement().toString();
            String unprocessedGroupCN = getCN(unprocessedGroupDN);
            //checking something here
        }
    }
}

private static SearchResult executeSearchSingleResult(DirContext ctx, int searchScope, String searchBase, String searchFilter, String[] attributes) throws NamingException {
    NamingEnumeration result = executeSearch(ctx, searchScope, searchBase, searchFilter, attributes);
    SearchResult sr = null;
    try {
        while (result.hasMoreElements()) {
            sr = (SearchResult) result.next();
            break;
        }
    } catch (Exception e) {
        log.error(e, e);
    }
    return sr;
}

private static NamingEnumeration executeSearch(DirContext ctx, int searchScope, String searchBase, String searchFilter, String[] attributes) throws NamingException {
    SearchControls searchCtls = new SearchControls();
    if (attributes != null) {
        searchCtls.setReturningAttributes(attributes);
    }
    searchCtls.setSearchScope(searchScope);
    NamingEnumeration result = ctx.search(searchBase, searchFilter, searchCtls);
    return result;
}

当没有嵌套组时,这可以正常工作。但是假设我有以下组和用户结构:

My Admins (dn = CN=My Admins,CN=Users,DC=mydomain,DC=local)
    AdminUser1 (dn = CN=AdminUser 1,CN=Users,DC=mydomain,DC=local)
        AdminGroup1 (dn = CN=AdminGroup 1,CN=Users,DC=,mydomain,DC=local)
            AdminUser2 (dn = CN=AdminUser 2,CN=Users,DC=mydomain,DC=local)

这发现 AdminUser1 很好。它找不到 AdminUser2。我需要做的是发现 AdminUser2 一直返回到名为 My Admins 的最高级别组。

我发现了很多对 1.2.840.113556.1.4.1941 的引用,但将其放入搜索过滤器的不同方法并没有帮助。

我需要在代码和/或搜索过滤器中进行哪些更改才能收集任何特定组嵌套深度的特定用户一直返回到最顶层组?

最佳答案

使用LDAP_MATCHING_RULE_IN_CHAIN过滤器类似于:

(成员:1.2.840.113556.1.4.1941:=(CN=用户名,CN=用户,DC=YOURDOMAIN,DC=NET))

通常会查找用户 CN=UserName,CN=Users,DC=YOURDOMAIN,DC=NET 所属的所有组。

但是很复杂。

  • Microsoft Active Directory 有多个 group types
  • Microsoft Active Directory 有不同的 LDAP 服务 (普通目录和全局目录)
  • 限制

任何可能导致组不显示在结果中的情况。

所以这些组必须是 Security Groups你应该使用Global Catalog

还有一些限制。当组嵌套“太深”或“太宽”时,LDAP_MATCHING_RULE_IN_CHAIN 类型搜索往往会失败。嵌套级别过多或该成员所属的组过多。

关于java - 通过Java查找嵌套组中的LDAP用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998316/

相关文章:

java - 海量IO操作服务器选择哪种技术

c# - 在运行时替换 web.config appsettings 中的值(用于 Active Directory 身份验证)

php - Owncloud 同步应用程序 LDAP 身份验证

java - Spring 项目使用 CAS 进行身份验证,使用 LDAP 进行权限管理

java - 选择具有预期数量的唯一值和插入的 HashSet 的初始容量

java - NDEF_DISCOVERED 的多个 Activity

java - 试图遍历数组中的数组

c# - 使用 AccountManagement *快速*将多个用户添加到 AD 组

.net - Active Directory 事务感知吗?

PHP/LDAP : Bad Search Filter (OU with Ampersand)