我正在尝试使用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?这是解决此问题的正确方法吗?
答案 0 :(得分:0)
您应使用ContextSource.getContext(principal, credentials)
对用户进行身份验证。
获取使用提供的主体进行身份验证的DirContext实例 和凭据。 通常用于普通身份验证 。请注意,此方法永远不会使用本机Java LDAP池,即使此实例已配置为这样做。这个 是为了强制目标目录中的密码更改生效,因为 尽快。
出于安全原因对密码进行了哈希处理,您应该始终遵循LDAP服务器对用户进行身份验证,这是其主要目的之一。