簡體   English   中英

LDAP比較用戶名密碼?

[英]LDAP compare username password?

我是LDAP的新手,並且正在使用com.sun.jndi.ldap jar。

我有一個登錄頁面,用戶輸入用戶名和密碼。 我的工作是使用LDAP中的數據驗證憑據。

直到現在我已連接到LDAP服務器,經過身份驗證並檢索了uid。

現在我想比較用戶輸入的密碼和LDAP中的密碼(密碼是私有的,即查詢用戶ID時無法查看)。

有沒有辦法比較這兩個密碼?

我們有幾個樣本使用綁定作為用戶。 你應該提到別人,做一個綁定,從不比較密碼。 密碼比較是一種不好的做法,不應該使用,因為在密碼屬性上執行比較請求時,可能會繞過某些內置的LDAP服務器實現功能,如密碼過期和入侵檢測。

JNDI樣品

Java LDAP API提供search操作,從而導致LDAP比較。 這是一個相同的例子

如果在應用程序中有一個使用Spring Security的選項,那么它有一個允許您將身份驗證與LDAP集成的模塊。

文檔在這里

你問的是錯誤的問題。 使用LDAP的正確方法是使用用戶的憑據而不是您自己的憑據“綁定”到目錄。 在JNDI中,在將用戶的憑據設置為Context.SECURITY_PRINCIPALContext.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 

您還可以查看OracleLDAP Compare文檔

如果我理解正確,您將嘗試比較用戶輸入的密碼和Java代碼中LDAP中的密碼。 這在JAVA中是不可能的,因為java沒有從LDAP檢索密碼的選項。 我們只能要求LDAP驗證用戶輸入的詳細信息。 LDAP中的密碼不會以純文本形式存儲,而是會被加密和存儲。

暫無
暫無

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

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