2014-04-13 222 views
1

我試圖找出一種簡單的方法來驗證usernamepassword使用Java (JNDI),在我已經使用綁定(綁定DN和密碼)連接到LDAP之後。我已經在LDAP中手動添加了一個用戶,並且我想使用java來檢查驗證用戶的憑據(用戶名和密碼)。驗證用戶名密碼java ldap jndi

這是一個簡單明瞭的方法嗎?

下面的代碼我到目前爲止用於使用綁定(工作)連接到LDAP。

package org.jacob.testing; 
import java.util.Hashtable; 
import javax.naming.AuthenticationException; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import javax.naming.directory.*; 
import javax.naming.ldap.LdapContext; 


public class jacobLdap { 

    public static void main(String[] args) throws NamingException { 

     Hashtable env = new Hashtable(); 

      env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, "ldap://localhost:10389"); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system"); 
     env.put(Context.SECURITY_CREDENTIALS, "secret"); 


      DirContext ctx = new InitialDirContext(env); 
      NamingEnumeration answer = ctx.search("ldap://localhost:10389/ou=users,ou=system","(sn=Herring)",null); 

       // I've connected to LDAP, now how should I authenticate a user? 

    } 

} 
+0

你可以試着做一個綁定作爲新用戶。 – Franz

+0

這種情況是關閉還是仍然有問題? –

回答

0

概念,你有兩個選擇:

  • 綁定與「技術」的用戶,然後搜索用戶,並與一個供應
  • 使用用戶名和密碼,以實際結合比較他存儲的密碼LDAP

在大多數情況下,第二種方法更可取,因爲它更簡單,所需代碼更少。通常,用戶密碼甚至不可用作LDAP屬性(例如,如果您通過LDAP訪問MS Active Directory)。

正如@EJP暗示的那樣,第二種方法可能需要也可能不需要首先綁定管理員。如果您擁有小用戶羣,則他們都有可能位於LDAP樹的同一分支上(例如uid=<user>,ou=users,dc=company,dc=com)。這意味着您確切知道使用哪個DN進行綁定,因爲您只需在相同的位置注入相應的用戶名即可。但是,如果您擁有龐大的用戶羣,則用戶可能分佈在多個OU中。然後,您需要先以管理員身份綁定並搜索用戶(即搜索他的DN)。

+0

第一個選擇既不實際也不是好的做法:請參閱我的答案。 – EJP

+0

我不是這麼說嗎? –

+0

不是,不。還有其他更嚴重的反對意見,但不那麼簡單等。第一種方法沒有什麼可推薦它,甚至不應該列出。 – EJP

0

其基本思想是您作爲管理員綁定到LDAP來查找用戶,然後使用提供的密碼重新綁定該用戶。如果兩者都成功,則用戶存在並具有該密碼。

相反,其他的答案,你可以讀取,你不應該試圖比較自己的密碼。在正確設置的LDAP服務器中,密碼將被散列,因此您必須自己重新生成散列算法等等等等。它毫無意義且容易出錯,並且每個密碼可能有不同的算法。讓服務器做比較。