LDAP (облегченный протокол доступа к каталогам) — широко используемый протокол для доступа и обслуживания информационных служб каталогов. Одним из распространенных случаев использования является запрос того, является ли пользователь членом группы в каталоге LDAP. В этой статье блога мы рассмотрим различные методы выполнения запросов 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); Attributes attributes = ctx.getAttributes(groupDN); Attribute members = attributes.get("member"); boolean isMember = false; if (members != null) { isMember = members.contains(userDN); }
-
Запрос фильтра поиска.
Этот метод включает в себя создание фильтра поиска 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();
-
Запрос вложенной группы.
Если группы могут иметь вложенное членство, этот метод проверяет, является ли пользователь членом группы прямо или косвенно через вложенные группы.Пример кода:
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();
-
Рекурсивный запрос.
Этот метод рекурсивно обходит дерево каталогов 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 вы можете выбрать наиболее подходящий метод для вашего случая использования.