我让我的 Ldap 工作,我面临的唯一问题是当我尝试使用电子邮件登录时,这是我在下面代码中的 else 部分登录时。如果我的用户名与电子邮件不同,则会引发错误。即如果我的电子邮件是“[email protected]”并且我的用户名是“saurakum”,那么它将通过无效的用户名密码错误。在内部,我使用用户名来制作电子邮件,即如果用户使用名称“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 步过程:
作为管理用户绑定到 LDAP。请注意,这不应该是配置文件中定义的主用户:这是供 OpenLDAP 使用的。相反,它应该是 DIT 中提到的对下一步具有适当搜索访问权限的用户。
通过一些独特的属性搜索用户,例如在您的案例电子邮件中。
使用找到的用户 DN 和他指定的密码,尝试绑定为该用户(使用该reconnect()
方法,在适当更改上下文环境后)。
如果所有这些都成功,则您登录成功。如果 (2) 或 (3) 失败,你就失败了,注意你不应该告诉用户它是哪个:否则你正在向攻击者泄露信息。您不应提及是用户名(电子邮件)还是密码错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句