3

ネストされたグループを含め、ユーザーが属しているすべてのグループを検索したいと考えています。ユーザーがグループ A1 の一部であり、グループ A1 が A の一部である場合のように、A も取得したいと考えています。

以下はコードです。さまざまなフィルター文字列を試しましたが、期待される出力は何も得られません。

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();

...

どんな助けでも大歓迎です。

4

4 に答える 4

1

ユーザーの memberOf 属性リストを再帰的に検索する必要があると思います。たとえば、ユーザーがldapsearch呼び出しから次の ldif スタイルの結果を持っている場合:

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

..次に、再帰的に検索しgroup1group2追加のldap検索を使用して、それらのグループがmemberOfであるグループを検索する必要があります。

私は今似たようなことをしていますが、perl で、Active Directory からすべてのグループのすべてのメンバーのフラット リストを取得します。AD は使用するのobjectClass: groupに対し、OpenLDAP は使用する傾向があるか、objectClass: groupOfUniqueNamesまたはおそらく使用objectClass: posixGroupに応じて使用します (Linux ボックスなどの unix-y クライアント用の posix グループ、より一般的な情報用の groupOfUniqueNames グループ。ディレクトリからの情報を使用するクライアントに完全に依存します)。

編集:ADには、ユーザーのセキュリティグループのSIDを含むという属性もあるはずですtokenGroupsが、これはうまくいきませんでした。これはオプションであり、サイトの AD サーバーでは有効になっていないと思います。

于 2012-08-23T13:40:32.947 に答える
-1

文字列 searchFilter ="(&(objectClass=person)(samaccountname="+userName+"))"

私はsearchFilterを変更しましたが、動作します。

于 2013-10-10T15:13:47.370 に答える
-1

以下のコードは、ユーザーが属しているグループのリストを検索します。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();
}

}

于 2013-10-03T03:27:33.433 に答える