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

У меня есть сервер weblogic, использующий внешний LDAP в качестве провайдера для аутентификации. Затем мне нужно восстановить группы, с которыми связан конкретный пользователь в репозитории LDAP.

Логин использует стандартную нотацию Java:

<form method="POST" action="j_security_check">
<p>Username: <input type="text" name="j_username"/></p>
<p>Password: <input type="password" name="j_password"/></p>
<input type="submit" value="Login"/>
</form>

И после входа в систему я могу восстановить принципала, используя: ‹%= request.getUserPrincipal() %>

Но что мне сейчас нужно, так это восстановить все связанные группы для этого принципала из LDAP? Является ли это возможным?

[]s


person groo    schedule 04.08.2011    source источник


Ответы (3)


Получить список всех групп без использования LDAP может быть невозможно. API-интерфейсы JAAS обычно дают вам возможность узнать, принадлежит ли пользователь к определенной группе, но не получить все группы сразу.

Лучшее, что вы можете сделать без прямого доступа к LDAP, это что-то вроде

for (String group : allGroups) { 
  if (request.isUserInRole(group)) { 
    userGroups.add(group);
  }
}

Удар по производительности не должен быть слишком большим, если вы сделаете это один раз при создании сеанса, а затем сделаете userGroups доступными для сеанса. (Контейнер вполне может получить все группы при входе в систему.)

person wrschneider    schedule 15.08.2011
comment
Привет, после некоторого исследования я согласен с вами. Мое окончательное решение этой проблемы на самом деле должно было использовать request.isUserInRole, а обходной путь для получения групп требовал от меня использования проприетарного внутреннего класса weblogic. - person groo; 16.08.2011
comment
О, дополняю, но на самом деле мне не пришлось перебирать все группы после успешного входа в систему с использованием стандартного метода формы, я смог просто проверить request.isUserInRole, чтобы решить мою проблему. - person groo; 16.08.2011

Ответов может быть много. Одним из возможных ответов является создание базового DN с использованием участника и запрос к серверу каталогов с использованием области base, фильтра '(&)' и запроса атрибута isMemberOf. Например, в моей тестовой системе с использованием современного инструмента командной строки ldapsearch и принципала user.0:

ldapsearch --hostname localhost --port 1389 \
    --bindDN 'cn=directory manager' --baseDn \
    'uid=user.0,ou=people,dc=example,dc=com' \
    --searchScope base '(&)' isMemberOf
Password for user 'cn=directory manager':
dn: uid=user.0,ou=people,dc=example,dc=com
isMemberOf: cn=shadow entries,ou=groups,dc=example,dc=com
isMemberOf: cn=persons,ou=groups,dc=example,dc=com

Этот метод требует знания namingContext, в данном случае dc=example,dc=com, и того, где пользователи находятся в дереве. Другой аналогичный метод, когда местоположение пользователя неизвестно, заключается в том, чтобы сначала найти пользователя, а затем использовать отличительное имя из результатов поиска для выполнения вышеуказанного запроса. Если namingContext неизвестно, можно обнаружить namingContext из корневой DSE. Чтобы восстановить namingContext из корневой DSE, см. этот статья.

Есть некоторые широко используемые серверы каталогов, которые неправильно поддерживают стандарт LDAP и будут отвергать фильтр '(&)', если ваш сервер каталогов является одним из них, просто замените фильтр присутствия '(objectClass=*)'. Существует множество LDAP SDK для Java, я предпочитаю тот, что находится на UnboundID.

person Terry Gardner    schedule 05.08.2011
comment
Привет, Терри, но, насколько я понимаю, для этого потребуется прямой доступ к серверу ldap, я бы хотел использовать API JAAS для запроса LDAP. Любые идеи? - person groo; 09.08.2011

У меня такая же проблема. Поискав в Google, я нашел это: http://buttso.blogspot.com/2011/06/weblogic-server-listing-groups-of.html

Я надеюсь, что это поможет вам!

person user1214052    schedule 26.08.2013