Как найти все роли пользователя в LDAP с помощью UnboundID LDAP SDK?

У меня возникли проблемы с поиском ролей, к которым принадлежит пользователь, я пробовал следующий код, и он дает много атрибутов, но меня интересует, к каким ролям принадлежит пользователь в определенном приложении.

Пользователь, которого я ищу, принадлежит к следующим двум группам (роль пользователя и роль администратора). Как восстановить эту информацию?

DN: cn=userrole,ou=roles,ou=appname,ou=apps,ou=groups,dc=example,dc=no

DN: cn=adminrole,ou=roles,ou=имя приложения,ou=приложения,ou=группы,dc=пример,dc=нет

private final String host = "host.example.com";
private final int port = 389;
private final String bindDn = "uid=appname,ou=systems,dc=example,dc=no";
private final String password = "password";
private final String searchDn = "dc=example,dc=no";

public SearchResultEntry getUserDetails(String username) {
    try {
        final LDAPConnection connection = new LDAPConnection(host, port,
                bindDn, password);
        SearchResult searchResults;
        searchResults = connection.search(searchDn, SearchScope.SUB,
                "(uid=" + username + ")", "+");

        if (searchResults.getEntryCount() == 1) {
            SearchResultEntry entry = searchResults.getSearchEntries().get(
                    0);
            connection.close();
            return entry;
        } else {
            LOGGER.error("NOT FOUND!");
            connection.close();
            return null;
        }
    } catch (LDAPException e) {
        LOGGER.error("Exception");
        return null;
    }
}

person kajafls    schedule 29.07.2013    source источник
comment
Вы получаете ошибку или нет результатов? Возможно разрешения?   -  person jwilleke    schedule 29.07.2013
comment
также посмотрите здесь stackoverflow.com/questions/15051830/   -  person Michael    schedule 29.07.2013
comment
Ответ критически зависит от того, используете ли вы вложенные роли, группы групп и т. д.   -  person user207421    schedule 31.07.2013
comment
Это также зависит от того, какой сервер LDAP вы используете и какие схемы.   -  person user207421    schedule 17.05.2017


Ответы (2)


Используйте следующую функцию. Предположим, что вы работаете с SUN LDAP (используете uid):

Отредактировано

private boolean isGroupContainUser(LDAPConnection ldapConnection, String groupDn, String userDn) throws LDAPException {
    boolean ret = false;
    Entry groupEntry = ldapConnection.getEntry(groupDn);

    String[] memberValues = groupEntry.getAttributeValues("uniquemember");
    if (memberValues != null) {
        DN ldapUserDn = new DN(userDn);
        for (String memberEntryDnString : memberValues) {
            DN memberEntryDn = new DN(memberEntryDnString);
            if (memberEntryDn.equals(ldapUserDn)) {
                ret = true;
                break;
            }
        }
    }
    return ret;
}
person Michael    schedule 29.07.2013
comment
Рассмотрите возможность использования правил сопоставления вместо String#equalsIgnoreCase(). В данном случае это правило сопоставления DN. Например, два DN cn=abc, ou=people, dc=example, dc=com и cn=abc,ou=people,dc=example,dc=com эквивалентны (отличаются только пробелами, которые не имеют значения в DN), однако String#equalsIgnoreCase() не считает эти два DN одинаковыми. - person Terry Gardner; 30.07.2013
comment
Спасибо! Я обновил ответ. Я посмотрел это в коде и увидел, что Dn.equals выполняет свою работу. Правильный? - person Michael; 31.07.2013

Сервер может поддерживать либо memberOf, либо isMemberOf. Это атрибуты (на большинстве серверов эти атрибуты являются виртуальными, то есть не занимают никакого хранилища и генерируются по запросу клиента), наличие которых в объекте указывает на групповую принадлежность объекта. Вот пример, в котором предполагается, что сервер поддерживает атрибут isMemberOf:

String[] getGroupMembership() {

    try {

        // SSL can be supported by using a SocketFactory
        SocketFactory socketFactory = createSocketFactory();

        LDAPConnectionOptions options = new LDAPConnectionOptions();
        options.setConnectTimeoutMillis(connectTimeoutMillis);

        // Try to connect to a single server. It is also possible to use
        // a 'ServerSet' for support of multiple servers.
        LDAPConnection ldapConnection =
            new LDAPConnection(socketFactory,options,hostname,port,
                userDN,userPassword); 

        try {

            // Some broken directory servers, most notably the old Sun 
            // directory servers, do not support the legal filter "(&)".
            // If this is the case, use the present filter "(objectClass=*)"
            // instead. 
            SearchRequest searchRequest =
               new SearchRequest(userDN,SearchScope.BASE,"(&)","isMemberOf");
            searchRequest.setResponseTimeoutMillis(responseTimeoutMillis);

            SearchResult searchResult = ldapConnection.search(searchRequest);

            if(searchResult.getEntryCount() == 1) {
                Entry entry = searchResult.getSearchEntry(userDN);
                return getAttributeValues("isMemberOf");
           }

        } catch(LDAPException ex) {
            // Handle the exception
        } finally {
            ldapConnection.close();
        }

    } catch(LDAPException ldapException) {
        // Handle the connection exception here
    } 

    return null;
}

смотрите также

person Terry Gardner    schedule 30.07.2013
comment
Как лучше всего решить проблему поиска всех групп пользователей в LDAP?? Как вы сказали, memberOf является виртуальным атрибутом и не существует в большинстве клиентских LDAP. Я вижу только, что можно перебрать все группы в LDAP и проверить, соответствует ли атрибут группы member (tools.ietf.org/html/rfc4519#section-2.17) содержит DN пользователя. Это не так хорошо с точки зрения производительности. Можете ли вы предложить лучшее решение? - person Michael; 31.07.2013
comment
Если сервер не поддерживает memberOf или isMemberOf, я не могу придумать лучшей альтернативы, кроме как перейти на сервер, поддерживающий один из этих атрибутов. - person Terry Gardner; 31.07.2013