java - 使用 LDAP 和 Java 进行用户身份验证
问题描述
我正在尝试使用 LDAP 对用户进行身份验证。但是,密码在 LDAP 中是经过 SSHA 散列的。当我向 ldap 发送明文密码时,如何验证 uid 和密码。这是我的代码
Properties initialProperties=new Properties();
initialProperties.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
initialProperties.put(Context.PROVIDER_URL,"ldap://localhost:10389");
initialProperties.put(Context.SECURITY_AUTHENTICATION,"simple");
initialProperties.put(Context.SECURITY_PRINCIPAL,"uid=admin,ou=system");
initialProperties.put(Context.SECURITY_CREDENTIALS,"secret");
NamingEnumeration<?> results = null;
try
{
DirContext ctx = new InitialDirContext(initialProperties);
System.out.println(ctx+"222 success");
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String filter = "(&(objectClass=inetOrgPerson)(uid=" + uID + ")(userPassword="+pwd+")";
results = ctx.search("", filter, controls);
if (results.hasMore()) {
System.out.println("User found");
return true;
} else {
System.out.println("User not found");
return false;
}
}
catch (Exception e)
{
return false;
}
sysout 总是找不到用户,因为它无法将明文密码与 ssha 哈希密码匹配?如何在发送到 ldap 之前将密码转换为 SSHA?这是解决此问题的正确方法吗?
解决方案
您应该使用ContextSource.getContext(principal, credentials)
来验证用户。
获取使用提供的主体和凭据进行身份验证的 DirContext 实例。通常用于普通身份验证目的。请注意,此方法永远不会使用本机 Java LDAP 池,即使此实例已配置为这样做。这是为了强制目标目录中的密码更改尽快生效。
出于安全原因,密码经过哈希处理,您应该始终遵循 LDAP 服务器来验证用户身份,这是它的主要目的之一。
推荐阅读
- java - Java 线的交点并找到其坐标及其右侧或下方最近的邻居
- java - 正确使用 ParameterizedTypeReference
- xcode - 在情节提要上进行视觉评论
- scipy - scipy kde轮廓到概率
- actions-on-google - Action On Google,带有 actions.intent.NEW_SURFACE 的 webhook 响应
- javascript - 使用 for 循环和 indexOf 检查单词是否存在时出现标记错误
- azure-devops - 通过powershell构建的vsts中的git commit不起作用
- c# - 错误:将图像文件转换为字节时无法访问已关闭的文件
- javascript - How do I add a path to a cookie function?
- javascript - 使用 Node Stream 加入音频文件