Java如何使用DN从ldap获取属性?

时间:2015-05-29 18:23:42

标签: java active-directory ldap

我有一个用于搜索组的Java应用程序。它基于组名(cn)的搜索工作得很好,但有时我会得到多个结果,因为在其他分支中使用了相同的cn。我有该组的DN,我想知道如何根据DN进行搜索,或者是否可以直接访问该属性,因为我有完整的路径。这是我使用的代码:

public Group getGroup( String groupName) throws Exception {

        List<User> memberList = new ArrayList<User>();

        // Create the search controls
        SearchControls searchCtls = new SearchControls();

        // Specify the search scope
        searchCtls.setSearchScope( SearchControls.SUBTREE_SCOPE );

        // Specify the attributes to return
        String returnedAtts[] = { MEMBER_FIELD };

        searchCtls.setReturningAttributes( returnedAtts );

        // Specify the LDAP search filter
        String searchFilter = "(&(objectClass=group)(CN=" + groupName + "))";

        // Search for objects using the filter
        NamingEnumeration<SearchResult> answer = ctxMap.get( configMap.get( GROUP ) ).search( configMap.get( SEARCHBASE ), searchFilter,
                searchCtls );

        SearchResult sr = null;


        // Loop through the search results
        while ( answer.hasMoreElements() ) {
            sr = (SearchResult) answer.next();
        }
        if ( sr == null  ) {
            return group;
        }

        // Create an attribute for memberOf
        javax.naming.directory.Attribute member = sr.getAttributes().get( MEMBER_FIELD );

        // Enumeration of all elements in memberOf
        NamingEnumeration<?> ne = member.getAll();


        // Loop though the enumeration, cut unwanted characters and add all
        // elements to User List
        while ( ne.hasMoreElements() ) {
            ...
        }

    }

所以我想将组的专有名称作为参数传递给函数而不是组名,并对其进行搜索或直接获取属性。这可能吗?

PS:此代码用于获取某个组的成员。

谢谢

2 个答案:

答案 0 :(得分:1)

如果您拥有DN,则无需搜索。只需查一下,查找()。

答案 1 :(得分:1)

在EJP的帮助下,我发现了一种在不进行搜索的情况下从DistinguishedName获取属性的方法:

Attributes attrs;
attrs = ctx.getAttributes( dn );

Attribute attr= attrs.get( "the attribute you need" );