我遇到问题需要尽快解决,需要你的帮助。
我有一个非常简单的java程序,仅用于ldap用户的样本认证
问题-1 - :
public static void main(String[] args) throws NamingException {
final String ldapAdServer = "ldap://0.0.0.0:389";
final String ldapUsername = "uid=test,ou=People,dc=example,dc=com";
final String ldapPassword = "gdyb21LQTcIANtvYMT7QVQ==";
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
if (ldapUsername != null) {
env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
}
if (ldapPassword != null) {
env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
}
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapAdServer);
env.put("java.naming.ldap.attributes.binary", "objectSID");
DirContext ctx = new InitialDirContext(env);
}
运行上面的程序会出现“[LDAP:错误代码49 - 无效凭据]”错误我也已经对ldap用户进行了导出,userPassword与在程序中输入的相同
dn: uid=test,ou=People,dc=example,dc=com
objectClass: person
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: top
uid: test
mail: test@yopmail.com
userPassword: {MD5}gdyb21LQTcIANtvYMT7QVQ==
我上面输入的密码和java代码抛出错误另外我使用了dsconfig并配置了“default-password-storage-scheme”来使用MD5,当我只提供普通密码但我需要的时候同样适用将MD5十六进制密码传递给ldap以进行身份验证。
问题2 - : 我们使用liferay作为后端系统,如果用户正在更改密码,所有用户的详细信息必须存储在ldap中liferay使用MD5和十六进制编码生成密码“098f6bcd4621d373cade4e832627b4f6 “但是当使用export ldiff选项导出相同时,我们在ldap”{MD5} gdyb21LQTcIANtvYMT7QVQ ==“中出现这样的情况。在liferay和ldap生成的密码之间存在不匹配我希望liferay md5密码进入ldap。 再次输入从ldiff文件获得的相同密码,并将其放在java程序中似乎不起作用,并且明文密码可以正常工作。
需要认真帮助。
如果需要任何其他信息,请随意。
答案 0 :(得分:3)
您的代码没有任何问题。问题是OpenDJ期望明文密码而不是散列值(这是你正在使用的)。
当OpenDJ收到绑定请求(绑定请求是用户如何对LDAP服务器进行身份验证)时,它将从请求中获取密码,计算哈希值,并将其与存储在 userPassword <中的值进行比较/ em>属性( gdyb21LQTcIANtvYMT7QVQ == 在您的情况下)。请注意,OpenDJ会预先添加最初使用的哈希算法(MD5,SHA1等)。
因此,使用明文密码应修复问题1 。
上述说明还应该说明导致问题2 的原因。 Liferay在修改OpenDJ中的 userPassword 属性时传递密码哈希。然而,OpenDJ认为它接收到明文值,因此它会再次出现密码。因此,你最终会得到一个&#34; double hashed&#34; LDAP服务器中的密码。
您有两种方法可以解决问题2: