Методы запроса LDAP для определения членства пользователя или группы

LDAP (облегченный протокол доступа к каталогам) — широко используемый протокол для доступа и обслуживания информационных служб каталогов. Одним из распространенных случаев использования является запрос того, является ли пользователь членом группы в каталоге LDAP. В этой статье блога мы рассмотрим различные методы выполнения запросов LDAP для определения членства пользователя или группы, а также приведем примеры кода.

Методы:

  1. Прямой запрос на членство.
    В этом методе мы напрямую запрашиваем отличительное имя (DN) пользователя, чтобы проверить, указано ли оно в качестве члена группы.

    Пример кода:

    String userDN = "CN=John Doe,OU=Users,DC=example,DC=com";
    String groupDN = "CN=Admins,OU=Groups,DC=example,DC=com";
    DirContext ctx = new InitialDirContext(env);
    Attributes attributes = ctx.getAttributes(groupDN);
    Attribute members = attributes.get("member");
    boolean isMember = false;
    if (members != null) {
       isMember = members.contains(userDN);
    }
  2. Запрос фильтра поиска.
    Этот метод включает в себя создание фильтра поиска LDAP для поиска DN пользователя в атрибуте члена группы.

    Пример кода:

    String userDN = "CN=John Doe,OU=Users,DC=example,DC=com";
    String groupDN = "CN=Admins,OU=Groups,DC=example,DC=com";
    DirContext ctx = new InitialDirContext(env);
    String searchFilter = "(&(objectClass=group)(member=" + userDN + "))";
    SearchControls controls = new SearchControls();
    controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    NamingEnumeration<SearchResult> results = ctx.search(groupDN, searchFilter, controls);
    boolean isMember = results.hasMore();
    results.close();
  3. Запрос вложенной группы.
    Если группы могут иметь вложенное членство, этот метод проверяет, является ли пользователь членом группы прямо или косвенно через вложенные группы.

    Пример кода:

    String userDN = "CN=John Doe,OU=Users,DC=example,DC=com";
    String groupDN = "CN=Admins,OU=Groups,DC=example,DC=com";
    DirContext ctx = new InitialDirContext(env);
    String searchFilter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=" + userDN + "))";
    SearchControls controls = new SearchControls();
    controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    NamingEnumeration<SearchResult> results = ctx.search(groupDN, searchFilter, controls);
    boolean isMember = results.hasMore();
    results.close();
  4. Рекурсивный запрос.
    Этот метод рекурсивно обходит дерево каталогов LDAP, чтобы найти DN пользователя в атрибутах членов группы.

    Пример кода:

    String userDN = "CN=John Doe,OU=Users,DC=example,DC=com";
    String groupDN = "CN=Admins,OU=Groups,DC=example,DC=com";
    boolean isMember = false;
    DirContext ctx = new InitialDirContext(env);
    NamingEnumeration<SearchResult> results = ctx.search("", "(objectClass=group)", new SearchControls());
    while (results.hasMore()) {
       SearchResult searchResult = results.next();
       Attributes attributes = searchResult.getAttributes();
       Attribute members = attributes.get("member");
       if (members != null && members.contains(userDN)) {
           isMember = true;
           break;
       }
    }
    results.close();

LDAP предоставляет различные методы для запроса членства пользователей или групп в каталоге. В этой статье мы рассмотрели четыре различных метода, включая запрос прямого членства, запрос фильтра поиска, запрос вложенной группы и рекурсивный запрос. В зависимости от ваших конкретных требований и используемого вами сервера LDAP вы можете выбрать наиболее подходящий метод для вашего случая использования.