从LDAP获取组和用户

时间:2014-08-18 05:31:34

标签: java ldap

您好我正在尝试从LDAP和该组中的用户获取所有posixGroup。下面的代码是我到目前为止所做的,它返回给我所有的组,但我不知道如何获得这些组的用户。请指导我这种方法好吗?或者我应该首先获取用户,然后根据GID获取组名?

public static void main(String[] args) {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL,"ldap://192.168.*.*:389");
        env.put(Context.URL_PKG_PREFIXES, "com.sun.jndi.url"); 
        env.put(Context.REFERRAL, "ignore"); 
        env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        env.put(Context.SECURITY_PRINCIPAL, "cn=manager,dc=*,dc=*"); 
        env.put(Context.SECURITY_CREDENTIALS, "****");

        DirContext ctx;
        try {
            ctx = new InitialDirContext(env);
        } catch (NamingException e) {
            throw new RuntimeException(e);
        }

        NamingEnumeration results = null;
        try {

            SearchControls controls = new SearchControls();
            controls.setSearchScope(SearchControls.SUBTREE_SCOPE);

            results = ctx.search("ou=path,dc=*,dc=*", "(objectClass=posixGroup)",controls);
            // Go through each item in list
            while (results.hasMore()) {
                SearchResult nc = (SearchResult)results.next();
                Attributes att=     nc.getAttributes();                           
                System.out.println("Group Name "+ att.get("cn").get(0));
                System.out.println("GID "+ att.get("GidNumber").get(0));
            }
        } catch (NameNotFoundException e) {
            System.out.println("Error : "+e);
        } catch (NamingException e) {
            throw new RuntimeException(e);
        } finally {
            if (results != null) {
                try {
                    results.close();
                } catch (Exception e) {
                    System.out.println("Error : "+e);
                }
            }
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (Exception e) {
                    System.out.println("Error : "+e);
                }
            }
        }      

    }

1 个答案:

答案 0 :(得分:2)

查询组中的所有用户

它取决于您的目录中的组使用哪个属性来表示成员资格。 posixGroup使用memberUid将用户名作为值(在RFC 2307中定义)。还有其他可能的属性(成员,唯一成员)和值(DN),因此请检查目录使用的内容。

因此,为了从一个组加载所有用户,您必须:

  1. 查询该群组,例如使用此过滤器(&(objectClass=posixGroup)(cn=<group name>))
  2. 遍历组中memberUid的所有值,每个值:
    1. 使用(&(objectClass=posixAccount)(uid=<memberUid>))
    2. 查询用户对象
    3. 然后,您可以访问uidNumber等用户属性。
  3. 这不是一种非常有效的方法,因为它会产生大量的小查询,但据我所知,LDAP无法使用它在单个结果中引用的用户条目来加入组条目(不像SQL)。

    您可以通过将结果限制为实际需要的属性来优化它:gidNumber用于组查询,uidNumber用于用户查询。使用SearchControls.setReturningAttributes()或带有attributesToReturn参数的DirContext.search()版本。它不会减少查询次数,只会减少返回的数据量。

    关于LDAP使用的一些更一般的注释

    • 如果您的查询有大量结果(例如&#34;所有用户&#34;),您可能会达到目录的结果大小限制(通常为5000),并且只会得到部分结果。
    • 修改组成员身份信息时,您必须同时更新posixAccountposixGroup个对象(除非您的目录服务器执行此操作,但我对此表示怀疑),否则会变得不一致。