2012-06-29 2 views
2

중첩 된 그룹을 포함하여 사용자가 속한 모든 그룹을 찾고 싶습니다. 사용자가 그룹 A1에 속하고 그룹 A1이 A의 일부인 경우처럼 A도 얻고 싶습니다.Java에서 중첩 그룹을 포함한 사용자의 모든 Ldap 그룹을 얻는 방법

다음은 코드입니다. 나는 다양한 필터 스트링을 시도했지만 아무런 결과도 기대되지 않았습니다.

String samAccountName = "group"; 

String searchFilter = "(&(objectclass=user)(memberof: 1.2.840.113556.1.4.1941:="+samAccountName+"))"; 

//String searchFilter = "(&(objectCategory=person)(memberOf=CN="+samAccountName+"))"; 

//String searchFilter = "(&(objectcategory=user)(memberof=CN="+samAccountName+",OU=Users,DC=new,DC=com))"; 

String searchBase = "DC=new,DC=com"; 

NamingEnumeration answer = ctx.search(searchBase, searchFilter, ontrols); 
      List rolesList = new ArrayList(); 
      while(answer.hasMoreElements()){ 
       SearchResult sr = (SearchResult)answer.next(); 

...

은 어떤 도움에 감사드립니다.

답변

1

사용자의 memberOf 속성 목록을 재귀 적으로 검색해야합니다. 예 : 사용자가 ldapsearch 호출에서 다음 LDIF 스타일의 결과가있는 경우 :

cn: user1 
memberOf: CN=group1,DC=foo,DC=example,DC=com 
memberOf: CN=group2,DC=foo,DC=example,DC=com 

재귀 해당 그룹이 그룹 등 group1 추가 LDAP 검색과 group2 등을 조회 할 수 있습니다 ..then membersOf.

저는 지금 당장 비슷한 일을하고 있지만 펄에서는 Active Directory에서 모든 그룹의 모든 구성원에 대한 평면 목록을 얻고 있습니다. AD는 objectClass: group을 사용하지만 OpenLDAP는 사용법에 따라 objectClass: groupOfUniqueNames 또는 objectClass: posixGroup을 사용하는 경향이 있습니다 (Linux 상자와 같은 유닉스 -y 클라이언트의 경우 posix 그룹,보다 일반적인 정보는 groupOfUniqueNames 그룹, 디렉토리의 정보를 사용하는 클라이언트에만 의존) .

편집 : AD에는 사용자를위한 보안 그룹의 SID가 포함 된 tokenGroups이라는 특성이 있어야하지만 나에게 적합하지 않습니다. 선택 사항이며 내 사이트의 AD 서버에서 사용하도록 설정되지 않은 것 같습니다. 코드 아래

0

는 사용자가 to.Sun LDAP 구현

package pack; 

import static javax.naming.directory.SearchControls.SUBTREE_SCOPE; 

import java.util.ArrayList; 
import java.util.Hashtable; 
import java.util.Iterator; 
import java.util.List; 

import javax.naming.AuthenticationException; 
import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 

import org.acegisecurity.GrantedAuthority; 
import org.acegisecurity.GrantedAuthorityImpl; 

import com.sun.jndi.ldap.LdapCtxFactory; 

class App4 
{ 

public static void main(String[] args) 
{ 

    String username = "userName"; 
    String password = "password"; 
    String serverName = "server"; 
    String domainName = "comp.BIZ"; 

    System.out.println("Authenticating " + username + "@" + domainName 
      + " through " + serverName + "." + domainName); 

    // bind by using the specified username/password 
    Hashtable<String,String> props = new Hashtable<String,String>(); 
    String principalName = username + "@" + domainName; 
    props.put(Context.SECURITY_PRINCIPAL, principalName); 
    props.put(Context.SECURITY_CREDENTIALS, password); 
    DirContext context; 

    try { 
     context = LdapCtxFactory.getLdapCtxInstance("ldap://" + serverName 
       + "." + domainName + '/', props); 
     System.out.println("Authentication succeeded!"); 

     // locate this user's record 
     SearchControls controls = new SearchControls(); 
     controls.setSearchScope(SUBTREE_SCOPE); 

     NamingEnumeration<SearchResult> renum = context.search(
       toDC(domainName), "(& (userPrincipalName=" + principalName 
         + ")(objectClass=user))", controls); 


     if (!renum.hasMore()) 
     { 
      System.out.println("Cannot locate user information for " 
        + username); 
      System.exit(1); 
     } 
     SearchResult result = renum.next(); 

     List<GrantedAuthority> groups = new ArrayList<GrantedAuthority>(); 
     Attribute memberOf = result.getAttributes().get("memberOf"); 
     if (memberOf != null) 
     {// null if this user belongs to no group at 
           // all 
      for (int i = 0; i < memberOf.size(); i++) 
      { 
       Attributes atts = context.getAttributes(memberOf.get(i) 
         .toString(), new String[] { "CN" }); 
       Attribute att = atts.get("CN"); 
       groups.add(new GrantedAuthorityImpl(att.get().toString())); 
      } 
     } 

     context.close(); 

     System.out.println(); 
     System.out.println("User belongs to: "); 
     Iterator<GrantedAuthority> ig = groups.iterator(); 
     while (ig.hasNext()) 
     { 
      System.out.println(" " + ig.next().toString()); 
     } 

    } catch (AuthenticationException a) 
    { 
     System.out.println("Authentication failed: " + a); 
     System.exit(1); 
    } catch (NamingException e) 
    { 
     System.out 
       .println("Failed to bind to LDAP/get account information: " 
         + e); 
     System.exit(1); 
    } 
} 

private static String toDC(String domainName) 
{ 
    StringBuilder buf = new StringBuilder(); 
    for (String token : domainName.split("\\.")) 
    { 
     if (token.length() == 0) 
      continue; // defensive check 
     if (buf.length() > 0) 
      buf.append(","); 
     buf.append("DC=").append(token); 
    } 
    return buf.toString(); 
} 

}

0

문자열 searchFilter = "(& (방법 objectClass = 사람) (SAMAccountName을 사용중인 속한 그룹 목록을 찾는 작업 = "+ userName +")) "

나는 searchFilter를 수정하여 작동합니다.

관련 문제