簡體   English   中英

驗證用戶名密碼Java ldap jndi

[英]Validate username password java ldap jndi

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

這是一種簡單,清晰的方法嗎?

到目前為止,我使用下面的代碼使用綁定(有效)連接到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?

    }

}

基本思想是,您以管理員身份綁定到LDAP來查找用戶,然后使用提供的密碼將該用戶重新綁定為該用戶。 如果兩者均成功,則該用戶存在並且具有該密碼。

與您可能會閱讀的其他答案相反,您不應嘗試自己比較密碼。 在正確設置的LDAP服務器中,密碼將被散列,因此您必須自己等來重現散列算法,等等。它毫無意義且容易出錯,每個密碼可以有不同的算法。 使服務器進行比較。

從概念上講,您有兩個選擇:

  • 與“技術”用戶綁定,然后搜索用戶並將其存儲的密碼與提供的密碼進行比較
  • 使用用戶和密碼實際綁定到LDAP

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

正如@EJP所暗示的那樣,對於第二種方法,可能首先必須以管理員身份綁定,也可能沒有必要。 如果您的用戶群很小,那么他們很有可能都位於LDAP樹的同一分支上(例如uid=<user>,ou=users,dc=company,dc=com )。 這意味着您確切知道要用於綁定的DN,因為您只需要在一致的位置插入相應的用戶名即可。 但是,如果您的用戶群很大,則用戶可以分布在多個OU中。 然后,您需要首先以admin身份綁定並搜索用戶(即搜索其DN)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM