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

How to connect LDAP With username and password?

我的 Ldap 正在工作,我面临的唯一问题是当我尝试使用电子邮件登录时,即当我进入以下代码的其他部分时。如果我的用户名与电子邮件不同,则会抛出错误。即如果我的电子邮件是 '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);
    }

通常这是一个 3 步过程:

  1. 以管理用户身份绑定到 LDAP。请注意,这不应该是配置文件中定义的主用户:那是供 OpenLDAP 自己使用的。相反,它应该是 DIT 中提及的用户,该用户对下一步具有适当的搜索访问权限。

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

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

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