Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNDI LDAP不返回任何内容_Java_Ldap_Jndi - Fatal编程技术网

Java JNDI LDAP不返回任何内容

Java JNDI LDAP不返回任何内容,java,ldap,jndi,Java,Ldap,Jndi,我被困在一个点上太久了。我试图通过JNDI使用LDAP对LDAP目录中的用户进行身份验证,但下面附加的代码对“结果”不返回任何内容,即搜索方法(标记为**)返回null。我试图调试代码,但不理解“DirContext”类的“search”函数背后到底发生了什么。有人能帮忙吗 public class Authenticate { @SuppressWarnings({ "unchecked", "rawtypes", "unused" }) public static void

我被困在一个点上太久了。我试图通过JNDI使用LDAP对LDAP目录中的用户进行身份验证,但下面附加的代码对“结果”不返回任何内容,即搜索方法(标记为**)返回null。我试图调试代码,但不理解“DirContext”类的“search”函数背后到底发生了什么。有人能帮忙吗

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");
        }
    }
}
公共类身份验证{
@SuppressWarnings({“未选中”、“原始类型”、“未使用”})
公共静态void main(字符串[]args)引发NamingException{
最后一个字符串ldapAdServer=”ldap://iauth.tum.de:389/cn=someuser,ou=users,ou=data,ou=prod,ou=iauth,dc=tum,dc=de”;
最后一个字符串ldapUsername=“cn=someuser,ou=users,ou=data,ou=prod,ou=iauth,dc=tum,dc=de”;
最后一个字符串ldapPassword=“somepassword”;
Hashtable env=新的Hashtable();
环境put(Context.SECURITY_身份验证,“无”);
如果(ldapUsername!=null){
环境put(Context.SECURITY\u主体,ldapUsername);
}
if(ldapPassword!=null){
环境put(Context.SECURITY_凭证,ldapPassword);
}
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER\u URL,ldapAdServer);
DirContext ctx=新的初始DirContext(env);
NamingEnumeration结果=空;
SearchControls=新的SearchControls();
控件.setSearchScope(SearchControls.SUBTREE_范围);
**结果=ctx.search(“,”(objectClass=Person)”,对照组**
while(results.hasMoreElements())
{
SearchResult SearchResult=(SearchResult)results.next();
Attributes=searchResult.getAttributes();
Attribute attr=attributes.get(“cn”);
}
}
}

由于“DirContext”(标记为**)的搜索方法不返回任何内容,因此我永远无法进入while循环。任何人都能知道我到底错在哪里。

将您的过滤器更改为“(objectClass=*),然后看,otoh,您使用的是JNDI而不是问题中提到的Apache LDAP API。

您似乎在搜索Active Directory实例。如果是这样(即使不是这样,问题也可能是一样的),那么问题不在于搜索代码,而在于初始设置。特别是,这条线路有故障:

env.put(Context.SECURITY_AUTHENTICATION, "none");
根据,将
SECURITY\u AUTHENTICATION
设置为“none”将执行匿名绑定,这意味着对LDAP目录的搜索请求似乎来自匿名用户。默认情况下,Active Directory在收到匿名绑定请求时不会返回错误,但匿名用户通常没有搜索目录的权限。为确保您的上下文已创建并绑定到适当的标识,您应将相关行更改为:

env.put(Context.SECURITY_AUTHENTICATION, "simple");

或者甚至根本不设置
SECURITY\u AUTHENTICATION
参数,因为它默认为“simple”。

感谢您指出这一点。我对这个领域有点陌生。但无论如何,将过滤器更改为您上面提到的过滤器并不会产生任何变化。是的,我甚至尝试过“简单”。但是我收到一个错误,上面写着“AuthenticationNotSupportedException”:[LDAP:错误代码13-需要保密性]。需要什么样的保密。我在Apache Directory Studion中尝试了相同的凭据,我可以从那里访问,而不是从API访问。“需要保密”意味着您需要使用SSL。您可以尝试更改url以
ldaps://
开头。可能还需要将LDAP url中的端口更改为636(默认的LDAPS端口)。非常感谢:)我在internet上阅读了有关将其更改为SSL的内容,但没有人提到更改端口号。它终于起作用了。再次感谢你!!