【问题标题】:Get groups and users from LDAP从 LDAP 获取组和用户
【发布时间】:2014-08-20 10:47:47
【问题描述】:

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

    }

【问题讨论】:

    标签: java ldap


    【解决方案1】:

    查询组内所有用户

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

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

    1. 查询该组,例如使用此过滤器(&(objectClass=posixGroup)(cn=<group name>))
    2. 遍历组中memberUid 的所有值,每个值:
    3. (&(objectClass=posixAccount)(uid=<memberUid>))查询用户对象
    4. 然后您可以访问uidNumber 等用户属性。

    这不是一种非常有效的方法,因为它会生成大量小查询,但据我所知,LDAP 无法将组条目与它在单个结果中引用的用户条目连接起来(不像SQL)。

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

    关于 LDAP 使用的一些更一般的说明

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

    【讨论】:

    • 我明白了,谢谢。但是我刚刚所做的是更改了某些 posixAccount 的组 ID,并且没有更新该组。所以我的用户有该组的 GID,但 poisxGroup 没有任何内容表明该用户是我的成员。那我该如何处理呢?
    • 那是你的想法,比如先获取用户列表,然后根据 GID 获取组
    • 您必须更新 posixAccount 和 posixGroup 对象中的组成员身份(除非您的目录服务器这样做,但我怀疑它会这样做),否则您发现它会变得不一致。您也可以先加载用户,但如果查询所有用户,请注意目录的结果大小限制。
    • 哦,是的。所以似乎我做错了,如果服务器配置正确,我可以期待。然后该组将拥有所有成员。
    • 所以如果我通过 memberUid 去,那么我必须再次搜索吗?因为我也需要该用户的 UID
    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2013-12-14
    • 2018-12-22
    • 2015-01-06
    相关资源
    最近更新 更多