Найти пользователя LDAP во вложенной группе через Java - PullRequest
0 голосов
/ 12 июля 2019

Ничто из того, что я нашел, не работает для меня.И у меня возникают проблемы с поиском ответов, которые имеют действительный код, а не просто вставляют строку фильтра поиска с другого сайта.

Соответствующий код, который пытается выполнить поиск:

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, но разные способы поместить это вфильтр поиска не помог.

Что мне нужно изменить в коде и / или фильтре поиска, чтобы выяснить, что конкретный пользователь на любой определенной глубине группового вложения проходит весь путь до самого верхагруппа

1 Ответ

1 голос
/ 13 июля 2019

Использование фильтра LDAP_MATCHING_RULE_IN_CHAIN ​​ аналогично:

(member:1.2.840.113556.1.4.1941:=(CN=UserName,CN=Users,DC=YOURDOMAIN,DC=NET))

Обычно находит все группы, в которые входит пользователь CN = UserName, CN = Users, DC = YOURDOMAIN, DC = NET .

Но это сложно.

  • В Microsoft Active Directory есть несколько групп типы
  • Microsoft Active Directory имеет разные службы LDAP (обычный и глобальный каталог)
  • Ограничения

Любое, что может привести к тому, что группа не будет отображаться в результатах.

Таким образом, группы ДОЛЖНЫ быть Группы безопасности , и вы должны использовать Глобальный каталог

И тогда есть ограничения. Поиск типа LDAP_MATCHING_RULE_IN_CHAIN, как правило, завершается неудачей, когда группы вложены «слишком глубоко» или «слишком широко». Это слишком много уровней вложенности или слишком много групп, членом которых является участник.

...