Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从LDAP获取组和用户_Java_Ldap - Fatal编程技术网

Java 从LDAP获取组和用户

Java 从LDAP获取组和用户,java,ldap,Java,Ldap,您好,我正在尝试从LDAP和该组中的用户获取所有posixGroup。下面的代码是我到目前为止所做的,它返回我所有的组,但我不知道如何获得这些组的用户。请指导我这个方法好吗?或者我应该先获取用户,然后根据GID获取组名吗 public static void main(String[] args) { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.

您好,我正在尝试从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);
                }
            }
        }      

    }
查询组中的所有用户 这取决于目录中的组使用哪个属性来表示成员身份
posixGroup
使用
memberUid
,用户名作为值(在中定义)。还有其他可能的属性(member、uniquemember)和值(DN),所以请检查目录使用了什么

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

  • 例如,使用此筛选器查询该组
    (&(objectClass=posixGroup)(cn=)
  • 迭代组中
    memberUid
    的所有值,针对每个值:
  • 使用
    (&(objectClass=posixAccount)(uid=))查询用户对象
  • 然后可以访问用户属性,如
    uidNumber
  • 这不是一种非常有效的方法,因为它将生成许多小查询,但据我所知,LDAP无法将组条目与它在单个结果中引用的用户条目连接起来(与SQL不同)

    您可以通过将结果限制为实际需要的属性来优化它:
    gidNumber
    用于组查询,而
    uidNumber
    用于用户查询。使用具有
    attributesToReturn
    参数的或其版本。但是,它并没有减少查询的数量,只是减少了返回的数据量

    关于LDAP使用的一些更一般的说明
    • 如果您的查询有大量结果(例如“所有用户”),您可能会达到目录的结果大小限制(通常为5000),并且只得到部分结果
    • 在修改组成员信息时,必须同时更新
      posixAccount
      posixGroup
      对象(除非目录服务器这样做,但我怀疑它会这样做),否则它会变得不一致

    我明白了,谢谢。但我只是更改了一些posixAccount的组ID,没有更新组。因此,我的用户有该组的GID,但PoissGroup没有任何内容表明该用户是我的成员。那么我该如何处理这种情况呢?这是y,我想换一种方式,比如先获取用户列表,然后基于GID获取组您必须更新posixAccount和posixGroup对象中的组成员身份(除非您的目录服务器这样做,但我怀疑它会),否则它会变得不一致。您也可以先加载用户,不过如果您查询所有用户,请注意目录的结果大小限制。看来我做错了,如果服务器配置正确,我可以预料到。然后,组中会有所有成员。因此,如果我使用memberUid,那么我必须再次搜索吗?因为我也需要该用户的UID