获取LDAP用户spring的组

时间:2017-01-17 16:54:35

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

我使用此代码检索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用户所在的组?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

请尝试使用java.lang.Thread方法,因为这会暴露可能发生的任何潜在异常。