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

Имам уеблогичен сървър, използващ външен 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>

И след влизането мога да възстановя Princial с помощта на: ‹%= 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 и заобиколното решение, за да накарам групите, изискваше от мен да използвам собствен вътрешен уеблогичен клас. - 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 сървъра, моята гледна точка би била да използвам JAAS API за запитване до 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