【问题标题】:Fetch groups of a LDAP user spring获取 LDAP 用户 spring 的组
【发布时间】:2017-06-01 20:18:15
【问题描述】:

我使用此代码检索 ldap 用户的组信息。

        String ldapUri = this.url; 
        Hashtable env = new Hashtable(); 
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
        env.put(Context.PROVIDER_URL, ldapUri); 
        env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        env.put(Context.SECURITY_PRINCIPAL, this.managerDn); 
        env.put(Context.SECURITY_CREDENTIALS, this.managerPassword); 
        try { 
            LdapContext ctx = new InitialLdapContext(env,null); 
            SearchControls ctls = new SearchControls(); 
            String[] attributes = {"memberOf"}; 
            ctls.setReturningAttributes(attributes); 
            ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
           NamingEnumeration<?> answer = ctx.search("dc=abc,dc=com", "(&(objectclass=user)(sAMAccountName=xxxx))", ctls); 

          **//At this point, I can see the values that I am expecting under entries of answer but hasMoreElements() returns false!** 

            while(answer.hasMoreElements()) { 
                SearchResult rslt = (SearchResult) answer.next(); 
                Attributes attrs = rslt.getAttributes(); 
                String groups = attrs.get("cn").toString(); 
                String [] groupname = groups.split(":"); 
                String userGroup = groupname[1]; 
                System.out.println(attrs.get("cn")); 
            } 
        } 
        catch(Exception e) { 
            e.printStackTrace(); 
        } 

answer.hasMoreElements() 返回 false。但是,我可以在调试时在 answer 对象的条目下看到我期望的值。有人可以告诉我我错过了什么。

如果这不是正确的方法,我如何获取 ldap 用户所在的组?

【问题讨论】:

    标签: spring spring-security ldap spring-ldap ldap-query


    【解决方案1】:

    由于 sAMAccountName 在上下文中是唯一的,因此您不应期望结果中有多个条目。您必须检索 memberOf 属性值才能了解组。

    【讨论】:

    • 这个答案如何帮助解决所述问题?
    • 我认为hasMoreElements() 的第一次执行工作正常,但attrs.get("cn") 将返回null,toString() 将爆炸。应该处理的是memberOf 属性。显然我没有完成就提交了答案。对不起。
    • 问题表明 hasMoreElements 返回 false
    • @marabu 可能你是对的,sAMAccountName 是唯一的,它只返回一个条目。但是出现的问题是当我尝试检索 memberOf 属性时,我还应该指定我试图在过滤器中获取此属性值的用户。那不过是 sAMAccountName。你有什么替代方法可以做到这一点吗?
    • 是您要检索的附加属性吗?只需添加它们:attributes = {"memberOf", "sAMAccountName"}
    【解决方案2】:

    NamingEnumerationhasMoreElements 方法默默地吞下任何可能发生的异常。我很确定在试图获取结果的过程中出现了问题。

    尝试改用hasMore 方法,因为这会暴露任何可能发生的潜在异常。

    【讨论】:

    • 也试过了。但是没有用。没有抛出任何异常。
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2017-10-30
    • 1970-01-01
    • 2015-01-06
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多