JNDI LDAP什么都不返回

时间:2014-01-21 14:33:34

标签: java ldap jndi

我已经坚持了很久。我正在尝试使用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循环。任何人都可以告诉我到底哪里错了。

2 个答案:

答案 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参数,因为它默认为“简单”。