2016-10-03 60 views
0

我面临的问题需要尽快解决,需要您的帮助。Java LDAP - 无法对用户进行身份验证

我有一个很简单的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用户和用户密码是相同的程序中输入

dn: uid=test,ou=People,dc=example,dc=com objectClass: person objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: top uid: test mail: [email protected] userPassword: {MD5}gdyb21LQTcIANtvYMT7QVQ==

我上面输入的密码和java代码一样都是抛出错误我已经使用dsconfig并配置了“default-password-storage-scheme”来使用MD5,当我给出简单的密码时,将MD5十六进制密码传递给ldap以获得认证。

发出─2-: 我们使用的Liferay作为后端系统,所有用户都必须的细节,如果用户更改密码的Liferay正在生成MD5和十六进制编码这样的事情“098f6bcd4621d373cade4e832627b4f6 ”密码存储在LDAP但当使用export ldiff选项导出时,我们在ldap“{MD5} gdyb21LQTcIANtvYMT7QVQ ==”中出现了类似的情况,liferay和ldap生成的密码之间存在不匹配。我想要使用liferay md5密码进入ldap。 再次输入从ldiff文件获得的相同密码并将其放在java程序中似乎不起作用,并且明文密码可以正常工作。

需要严肃的帮助。

如果需要任何其他信息,请随时留言。

回答

3

你的代码没有问题。问题是OpenDJ期望明文密码而不是哈希值(这就是你正在使用的)。

当OpenDJ接收绑定请求(绑定请求是用户针对LDAP服务器如何认证),它会抓住从请求中的口令,计算散列值,并将其与存储在的userPassword值属性(gdyb21LQTcIANtvYMT7QVQ ==在你的情况)。请注意,OpenDJ预先使用了最初使用的哈希算法(MD5,SHA1等)。

因此使用明文密码应该修复第1期

上面的解释也应该引起一些关于第2期的原因。 Liferay在修改OpenDJ中的userPassword属性时传递密码哈希。然而,OpenDJ认为它正在接收明文值,所以它再次刷新密码。因此,最终在LDAP服务器中会出现“双重哈希”密码。

有两个选项来解决问题2:

  • 在Liferay中禁用散列,让OpenDJ做散列。
  • 允许LDAP中的预编码密码并配置Liferay以二进制格式传递密码值。要允许预编码密码,您只需将允许预编码密码高级密码策略属性设置为即可。恐怕我无法帮助您使用Liferay配置。
+0

嗨,感谢您对issue1的即时响应,我们已经有超过40万的用户将从liferay db导入到ldap中,并且他们的密码将被散列现在我该如何处理这种情况liferay使用MD5与十六进制对于二进制格式,你的意思是base64编码? – ravicandy1234

相关问题