我使用此代码检索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用户所在的组?
答案 0 :(得分:0)
由于sAMAccountName在上下文中是唯一的,因此您不应期望结果中有多个条目。您必须检索memberOf属性值才能了解这些组。
答案 1 :(得分:0)
NamingEnumeration
hasMore
方法默默地吞下可能发生的任何异常。我很确定在试图获取结果的情况下出现了问题。
请尝试使用java.lang.Thread
方法,因为这会暴露可能发生的任何潜在异常。