[英]LDAP compare username password?
我是LDAP的新手,並且正在使用com.sun.jndi.ldap
jar。
我有一個登錄頁面,用戶輸入用戶名和密碼。 我的工作是使用LDAP中的數據驗證憑據。
直到現在我已連接到LDAP服務器,經過身份驗證並檢索了uid。
現在我想比較用戶輸入的密碼和LDAP中的密碼(密碼是私有的,即查詢用戶ID時無法查看)。
有沒有辦法比較這兩個密碼?
我們有幾個樣本使用綁定作為用戶。 你應該提到別人,做一個綁定,從不比較密碼。 密碼比較是一種不好的做法,不應該使用,因為在密碼屬性上執行比較請求時,可能會繞過某些內置的LDAP服務器實現功能,如密碼過期和入侵檢測。
Java LDAP API提供search
操作,從而導致LDAP比較。 這是一個相同的例子 。
如果在應用程序中有一個使用Spring Security的選項,那么它有一個允許您將身份驗證與LDAP集成的模塊。
你問的是錯誤的問題。 使用LDAP的正確方法是使用用戶的憑據而不是您自己的憑據“綁定”到目錄。 在JNDI中,在將用戶的憑據設置為Context.SECURITY_PRINCIPAL
和Context.SECURITY_CREDENTIALS.
的上下文環境之后,這對應於LdapContext.reconnect()
操作Context.SECURITY_CREDENTIALS.
這會導致LDAP服務器根據需要進行密碼比較。
如果您確實想要比較字段(不限於用戶名和密碼),可以在search
方法上使用以下包裝器 :
public boolean compare(LdapContext ctx, String dn, String filter) {
NamingEnumeration<SearchResult> answer = null;
try {
SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE);
searchCtls.setReturningAttributes(new String[0]);
answer = ctx.search(dn, filter, searchCtls);
if (answer == null || !answer.hasMore()) {
return false; // E.g.: wrong filter
}
} catch (NamingException ex) {
return false; // E.g.: wrong DN
}
return true;
}
ctx
可能是:
LdapContext ctx = new InitialLdapContext(getEnvironment(userName, password), null);
並且getEnvironment
方法可以是:
private Hashtable<String, Object> getEnvironment(String userName, String password) {
Hashtable<String, Object> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, LDAP_HOST_389);
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
env.put(Context.SECURITY_PRINCIPAL, userName);
env.put(Context.SECURITY_CREDENTIALS, password);
return env;
}
如果您調用上面的compare
方法,您將獲得:
false
(例如:無效的dn
,無效的filter
) 否則為true
。 在這種情況下,如果您在compare
方法中檢查answer
,您將看到:
SearchResult sr = answer.next(); sr.getName(); // this is empty sr.getAttributes(); // No attributes
您還可以查看Oracle的LDAP Compare文檔 。
如果我理解正確,您將嘗試比較用戶輸入的密碼和Java代碼中LDAP中的密碼。 這在JAVA中是不可能的,因為java沒有從LDAP檢索密碼的選項。 我們只能要求LDAP驗證用戶輸入的詳細信息。 LDAP中的密碼不會以純文本形式存儲,而是會被加密和存儲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.