2016-10-03 61 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

相關問題