如何使用用户名和密码连接LDAP?

时间:2018-05-29 11:25:02

标签: ldap openldap ldap-query

我的Ldap工作是我遇到的唯一问题,当我尝试使用电子邮件登录时,我登陆以下代码中的else部分。如果我的用户名与电子邮件不同,则会引发错误。即如果我的电子邮件是'skumar@gmail.com'而我的用户名是'saurakumar',那么它将通过无效的用户名密码错误。 在内部,我使用用户名来发送电子邮件,即如果用户使用名称'karan'登录,那么我希望该电子邮件是karan @ gmail.com,这在许多情况下都不正确,并且身份验证失败。我正在寻找一些解决方案,我可以通过电子邮件或用户名登录我将能够验证用户。以下是我的代码片段。请提出建议?

    ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
    ldapEnv.put(Context.PROVIDER_URL, url);
    ldapEnv.remove(Context.SECURITY_PROTOCOL);
    if (email == null) {
        lContext = new InitialLdapContext(ldapEnv, null);
        entryResult = searchUserEntry(lContext, user, searchCtrls);
        final String usrDN = ((Context) entryResult.getObject()).getNameInNamespace();

        lContext.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
        lContext.addToEnvironment(Context.SECURITY_PRINCIPAL, usrDN);
        lContext.addToEnvironment(Context.SECURITY_CREDENTIALS, pass);
        lContext.reconnect(null);
    } else {
            ldapEnv.put(Context.SECURITY_PRINCIPAL, email);
            ldapEnv.put(Context.SECURITY_CREDENTIALS, credentials);
            lContext = new InitialLdapContext(ldapEnv, null);
            return lContext;
        searchUserEntry(lContext, user, searchCtrls);
    }

1 个答案:

答案 0 :(得分:1)

通常这是一个分为三步的过程:

  1. 作为管理用户绑定到LDAP。请注意,这不应该是配置文件中定义的主用户:OpenLDAP使用它本身。相反,它应该是DIT中提到的用户,它具有适合下一步的搜索访问权限。

  2. 通过一些独特的属性搜索用户,例如在您的情况下发送电子邮件。

  3. 使用找到的用户DN和他指定的密码,在适当更改上下文环境后,尝试以该用户绑定(使用reconnect()方法。)

    < / LI>

    如果一切顺利,您的登录成功。如果(2)或(3)失败,则表示您失败,请注意您不应告诉用户它是哪个:否则您将向攻击者泄露信息。你不应该提到它是用户名(电子邮件)还是密码错误。