验证用户名密码java ldap jndi

验证用户名密码java ldap jndi,java,ldap,jndi,Java,Ldap,Jndi,在我已经使用绑定(绑定DN和密码)连接到LDAP之后,我正试图找到一种简单的方法来使用Java(JNDI)验证用户名和密码。我已经在LDAP中手动添加了一个用户,我想使用java检查并验证用户的凭据(用户名和密码) 这是一种简单明了的方法吗 下面的代码是我到目前为止使用绑定连接到LDAP的代码(可以正常工作) 从概念上讲,您有两种选择: 绑定“技术”用户,然后搜索用户并将其存储的密码与提供的密码进行比较 使用用户和密码实际绑定到LDAP 在大多数情况下,第二种方法更可取,因为它更简单,需要更

在我已经使用绑定(绑定DN和密码)连接到LDAP之后,我正试图找到一种简单的方法来使用
Java(JNDI)
验证
用户名
密码
。我已经在LDAP中手动添加了一个用户,我想使用java检查并验证用户的凭据(用户名和密码)

这是一种简单明了的方法吗

下面的代码是我到目前为止使用绑定连接到LDAP的代码(可以正常工作)


从概念上讲,您有两种选择:

  • 绑定“技术”用户,然后搜索用户并将其存储的密码与提供的密码进行比较
  • 使用用户和密码实际绑定到LDAP
在大多数情况下,第二种方法更可取,因为它更简单,需要更少的代码。通常,用户密码甚至不能作为LDAP属性使用(例如,如果通过LDAP访问MS Active Directory)


正如@EJP所暗示的,对于第二种方法,可能需要也可能不需要首先绑定为admin。如果用户基数较小,则很可能他们都位于LDAP树的同一分支上(例如,
uid=,ou=users,dc=company,dc=com
)。这意味着您确切地知道用于绑定的DN是什么,因为您只需要在一致的位置注入相应的用户名。但是,如果用户群很大,则用户可能分布在多个OU中。然后,您需要首先以管理员身份绑定并搜索用户(即搜索他的DN)。

基本思想是,您以管理员身份绑定到LDAP以查找用户,然后使用提供的密码以该用户身份重新绑定。如果两者都成功,则用户存在并拥有该密码


与您可能阅读的其他答案相反,您不应尝试自己比较密码。在正确设置的LDAP服务器中,密码将被散列,因此您必须自己复制散列算法等等。它毫无意义且容易出错,每个密码可能有不同的算法。让服务器进行比较。

您可以尝试作为新用户进行绑定。此案例是否已结束,或者您是否仍有问题?我面临着相同的问题。您是如何解决此问题的,是否有针对上述问题的示例代码?第一个选项既不实用,也不是很好的做法:请参阅我的答案。不是真的,不是。还有其他选项,更严重的,除了不太简单之外的反对意见等等。第一种方法没有什么可推荐的,甚至不应该被列出。“除了不太简单之外还有其他更严重的反对意见等等”-没错,这当然是正确的,即使我没有推荐第一种方法,我也应该提到它们。
package org.jacob.testing;
import java.util.Hashtable;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.*;
import javax.naming.ldap.LdapContext;


public class jacobLdap {

    public static void main(String[] args) throws NamingException {

        Hashtable env = new Hashtable();

           env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://localhost:10389");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system");
        env.put(Context.SECURITY_CREDENTIALS, "secret");


            DirContext ctx = new InitialDirContext(env);
            NamingEnumeration answer = ctx.search("ldap://localhost:10389/ou=users,ou=system","(sn=Herring)",null);

                // I've connected to LDAP, now how should I authenticate a user?

    }

}