[英]Validate username password java ldap jndi
在使用綁定(綁定DN和密碼)連接到LDAP之后,我試圖找出一種使用Java (JNDI)
驗證username
和password
的簡單方法。 我已經在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訪問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.