当前位置: 首页 > 知识库问答 >
问题:

从LDAP获取组和用户

阮星火
2023-03-14

嗨,我试图从LDAP和该组中的用户获取所有postxGroup。下面的代码是我到目前为止所做的,它返回我所有的组,但我不知道如何获得这些组的用户。请指导我这种做法好吗?或者我应该先得到用户,然后根据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个答案

东郭自珍
2023-03-14

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

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

  1. 查询该组,例如使用此筛选器(

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

您可以通过将结果限制为实际需要的属性来优化它:gidNumber用于组查询,而uidNumber用于用户查询。使用搜索控件。设置ReturningAttributes()DirContext的版本。search()接受attributesToReturn参数。不过,它并没有减少查询的数量,只是减少了返回的数据量。

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

 类似资料:
  • 你能告诉我如何向控制台或视图显示用户角色以进行测试吗?我可以通过从ldap中的用户列中获取用户角色来重新定义(默认情况下从ldap'cn'获取角色)用户角色吗? 谢谢你。

  • 我想使用java中的spring从ldap获取userPassword属性。 当然,这不起作用: 如果我尝试: 我可以得到这个属性...但是现在从Object如何获取哈希密码?

  • 我正在尝试验证Nexus Sonatype配置。我从这里发现了Groovy脚本: https://github . com/savoirfairelinux/ansi ble-nexus 3-OSS/tree/master/templates/groovy 我能够在Nexus Sonatype中配置LDAP,甚至创建一个新角色(不是从LDAP)。但现在我正在搜索如何获取LDAP用户,然后将他们放在

  • 我正在使用openLDAP服务器对我的夸克应用程序上的用户进行身份验证。一切正常,但我想检索我的用户数据。 我以为它会出现在方法身份中。getAttributes()但这给了我一个空映射。 以下是一个用户示例: 这也是我的ldap配置: 如何获取我的用户邮件和CN? 非常感谢您的帮助, 托马斯

  • 我一直在寻找一种使用spring ldapTemplate通过LDAP验证用户名的方法。 我的搜索结果是 但我想知道我需要在contextMapper或attributeMapper中添加什么。据我所知,它用于将数据映射到对象。但我不需要这个东西。我只想知道布尔值是否存在。 我的属性示例: 我的模板包含url、用户名和密码,连接已经建立。 我需要一些帮助,因为我不确定使用搜索方法是否正确。 我已使

  • 我是LDAP的新手,我尝试过在OpenLDAP上实现RBAC。我创建了一些用户(inetOrganizationPerson)并将它们放在组中(groupOfNames)。接下来,我创建了一些角色(organizationalRole)并将它们与用户组关联(RoleIncuspant),而不是直接将它们与用户关联。 1)/usr/local/bin/ldapsearch-x-b'ou=groups