2013-02-24 3 views
3

Использование UnboundID LDAP sdk, как я могу получить все группы LDAP, к которым принадлежит определенный пользователь? (Я бы очень признателен за примерный код).UnboundID LDAP SDK: получить все группы для пользователя

+0

Вы нашли, как это сделать? – Michael

+0

Нет, Майкл. У меня нет. – Neo

ответ

0

Функция ниже будет работать только для Active Directory, так как она генерирует атрибут член memberOf. Если я найду способ для общего LDAP, я его добавлю.

Entry userEntry = ldapConnection.getEntry(userDN); 

    List<Entry> entryList = new ArrayList(); 
    String[] memberValues = userEntry.getAttributeValues("memberOf"); 
    if (memberValues != null) { 
     DNEntrySource entrySource = new DNEntrySource(ldapConnection, memberValues); 
     while (true) { 
      Entry memberEntry = entrySource.nextEntry(); 
      if (memberEntry == null) { 
       break; 
      } 

      entryList.add(memberEntry); 
     } 
    } 

    return entryList; 
2

У меня такая же проблема. Однако решение Майкла не работает для меня, так как оно не работает рекурсивно.

Видимо, есть «волшебный» AD-запрос, который получает все группы рекурсивно, см Find Recursive Group Membership (Active Directory) using C# и How do I filter an LDAP query for groups containing a specific user?

В то время как наш AD администратор принес все группы из командной строки с помощью LDIFDE, я не могу получить запрос для работы с UnboundID. Наш CN имеет места внутри, а UnboundID добавляет странный «5c» - но даже с (техническим) пользователем без пробелов я не получаю никакого результата.

В любом случае, вот мой рабочий (и неэффективный) исходный код (с использованием Google Guava). Я оставил некоторые методы и константы, я думаю, что вы можете догадаться, что значение для константы OBJECT_CLASS это :-)

/** 
    * Gets the groups for a user which is identified by the filter. 
    * @param filter The filter that identifies the user 
    * @return The groups for the user 
    */ 
    private List<String> getGroups(final Filter filter) { 
    LDAPConnection connection = null; 
    try { 
     connection = getConnection(); 

     String userDN = getUserDN(connection, filter); 
     if (userDN == null) { 
     return Collections.emptyList(); // No user found 
     } 

     Multimap<String, String> groupsByDN = ArrayListMultimap.create(); 
     getGroupsRecursively(connection, userDN, groupsByDN); 
     Set<String> groups = new HashSet<>(groupsByDN.values()); 
     for (String dn : groupsByDN.keySet()) { 
     // The user is not a group... 
     if (!dn.equals(userDN)) { 
      DN distinguishedName = new DN(dn); 
      for (RDN rdn : distinguishedName.getRDNs()) { 
      if (rdn.hasAttribute(CN)) { 
       groups.add(rdn.getAttributeValues()[0]); 
       break; 
      } 
      } 
     } 
     } 
     return new ArrayList<String>(groups); 
    } catch (LDAPException e) { 
     throw new RuntimeException("Can't search roles for " + filter, e); 
    } finally { 
     if (connection != null) { 
     connection.close(); 
     } 
    } 
    } 

    /** 
    * Since LDAP groups are stored as a tree, this fetches all groups for a user, starting with the user's DN and then 
    * fetching every group's groups and so on. 
    * @param connection The LDAP connection 
    * @param distinguishedName The distinguished name for which groups are searched 
    * @param groupsByDN Contains a distinguished name as key and its group name as result; keys are only searched once! 
    * @throws LDAPSearchException if the LDAP search fails 
    */ 
    private void getGroupsRecursively(final LDAPConnection connection, final String distinguishedName, 
     final Multimap<String, String> groupsByDN) throws LDAPSearchException { 
    if (!groupsByDN.containsKey(distinguishedName)) { 
     Filter groupFilter = Filter.createANDFilter(Filter.createEqualityFilter(OBJECT_CLASS, GROUP), 
      Filter.createEqualityFilter(MEMBER, distinguishedName)); 
     SearchResult result = getSearchResult(connection, groupFilter, CN); 
     List<SearchResultEntry> searchResults = result.getSearchEntries(); 
     for (SearchResultEntry searchResult : searchResults) { 
     String groupName = searchResult.getAttributeValue(CN); 
     groupsByDN.put(distinguishedName, groupName); 
     getGroupsRecursively(connection, searchResult.getDN(), groupsByDN); 
     } 
    } 
    } 
Смежные вопросы