繁体   English   中英

验证用户名密码Java ldap jndi

[英]Validate username password java ldap jndi

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

这是一种简单,清晰的方法吗?

到目前为止,我使用下面的代码使用绑定(有效)连接到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?

    }

}

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

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

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

  • 与“技术”用户绑定,然后搜索用户并将其存储的密码与提供的密码进行比较
  • 使用用户和密码实际绑定到LDAP

在大多数情况下,第二种方法是更可取的,因为它更简单并且需要更少的代码。 通常,用户密码甚至都不能用作LDAP属性(例如,如果您通过LDAP访问MS Active Directory)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM