我已经坚持了很久。我正在尝试使用LDAP通过JNDI从LDAP目录中验证用户,但下面附带的代码不返回“结果”,即搜索方法(标记为**)返回null。我试图调试代码,但不明白“DirContext”类的“搜索”功能背后究竟发生了什么。有人可以帮忙吗?
public class Authenticate {
@SuppressWarnings({ "unchecked", "rawtypes", "unused" })
public static void main(String[] args) throws NamingException {
final String ldapAdServer = "ldap://iauth.tum.de:389/cn=someuser,ou=users,ou=data,ou=prod,ou=iauth,dc=tum,dc=de";
final String ldapUsername = "cn=someuser,ou=users,ou=data,ou=prod,ou=iauth,dc=tum,dc=de";
final String ldapPassword = "somepassword";
Hashtable env = new Hashtable();
env.put(Context.SECURITY_AUTHENTICATION, "none");
if(ldapUsername != null) {
env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
}
if(ldapPassword != null) {
env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
}
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapAdServer);
DirContext ctx = new InitialDirContext(env);
NamingEnumeration<SearchResult> results = null;
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
**results = ctx.search("", "(objectClass=Person)", controls);**
while (results.hasMoreElements())
{
SearchResult searchResult = (SearchResult) results.next();
Attributes attributes = searchResult.getAttributes();
Attribute attr = attributes.get("cn");
}
}
}
由于“DirContext”的搜索方法(在**中标记),什么都不返回,我永远不能进入while循环。任何人都可以告诉我到底哪里错了。
答案 0 :(得分:0)
将您的过滤器更改为“(objectClass = *)”并查看,otoh,您正在使用问题中提到的JNDI 而非 Apache LDAP API。
答案 1 :(得分:0)
您似乎正在搜索Active Directory实例。如果是这种情况(即使不是问题可能相同),那么问题与您的搜索代码无关,而是与初始设置有关。特别是,这条线是错误的:
env.put(Context.SECURITY_AUTHENTICATION, "none");
每the documentation,将SECURITY_AUTHENTICATION
设置为“none”会执行匿名绑定,这意味着您的搜索请求似乎来自匿名用户。默认情况下,Active Directory在收到匿名绑定请求时不会返回错误,但匿名用户通常无权搜索目录。要确保创建上下文并将其绑定到适当的标识,您应该将相关行更改为:
env.put(Context.SECURITY_AUTHENTICATION, "simple");
甚至根本没有设置SECURITY_AUTHENTICATION
参数,因为它默认为“简单”。