2011-08-04 4 views
4

인증을 위해 외부 LDAP를 공급자로 사용하는 웹 서버가 있습니다. 특정 사용자가 LDAP 리포지토리에 연결 한 그룹을 복구해야합니다.특정 사용자의 모든 LDAP 그룹을 얻는 방법은 무엇입니까?

로그인 표준 자바 표기법 사용

<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

답변

2

LDAP를 사용하지 않고 모든 그룹의 목록을 가져올 수 없을 수도 있습니다. JAAS API는 일반적으로 사용자가 특정 그룹에 속하는지 묻는 방법을 제공하지만 모든 그룹을 한 번에 가져올 수는 없습니다.

LDAP를 액세스하지 않고 할 수있을 수있는 최선 직접

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

당신이 세션 생성에 한 번을 누른 다음 사용자 그룹은 세션 범위 만들 경우 성능 저하가 너무 나쁘지 않을해야 같은 것입니다. (컨테이너는 로그인 할 때 모든 그룹을 얻을 수 있습니다.)

+0

안녕하세요, 잠시 동안 조사한 후에 당신과 동의합니다. 이 문제에 대한 최종 해결책은 실제로 request.isUserInRole을 사용하고 그룹에게 독점적 인 내부 웹 로직 클래스를 사용하도록 요청하는 해결 방법을 사용해야했습니다. –

+0

아, 보완하고 있지만, 표준 양식을 사용하여 성공적으로 로그인 한 후에 모든 그룹을 반복 할 필요가 없었습니다. 요청을 확인할 수있었습니다.isUserInRole 내 문제를 해결하기 위해. –

1

많은 답변이있을 수 있습니다. 한 가지 가능한 대답은 주체를 사용하여 기본 DN을 구성하고 범위 base, 필터 '(&)'을 사용하여 디렉터리 서버를 쿼리하고 isMemberOf 특성을 요청하는 것입니다.

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 

이 방법은이 경우 dc=example,dc=comnamingContext의 지식을 필요로하고, 여기서 사용자는 트리에있는 예를 들어, 내 테스트 시스템에서 현대 ldapsearch 명령 줄 도구 및 user.0의 주요를 사용하여. 사용자의 위치를 ​​알 수없는 다른 유사한 방법은 먼저 사용자를 검색 한 다음 검색 결과의 고유 이름을 사용하여 위의 쿼리를 수행하는 것입니다. namingContext을 알 수없는 경우 루트 DSE에서 namingContext을 검색 할 수 있습니다. 루트 DSE에서 namingContext을 복구하려면 article을 참조하십시오.

LDAP 표준을 올바르게 지원하지 않고 필터 '(&)'을 거부하는 널리 사용되는 디렉토리 서버가 있습니다. 디렉토리 서버가 이들 중 하나 인 경우 '(objectClass=*)'으로 바꾸기 만하면됩니다. Java 용 LDAP SDK는 많이 있습니다. 선호하는 것은 UnboundID입니다.

+0

하이 테리,하지만 내 이해에 LDAP 서버에 직접 액세스가 필요합니다, 내 요점은 LDAP 쿼리에 JAAS API를 사용하는 것입니다. 어떤 아이디어? –

관련 문제