LDAP比较用户名密码?

时间:2013-08-22 07:30:01

标签: java ldap

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

我有一个登录页面,用户输入的用户名和密码。我的工作是使用位于LDAP中的数据验证凭据。

直到现在我已连接到LDAP服务器,经过身份验证并检索了uid。

现在我要比较用户输入的密码和LDAP中的密码(密码是私有的,即查询用户ID时无法查看)。

有没有办法比较这两个密码?

6 个答案:

答案 0 :(得分:2)

我们有几个样本使用绑定作为用户。你应该提到别人,做一个绑定,从不比较密码。密码的比较是一种不好的做法,不应该使用,因为在密码属性上执行比较请求时,可能会绕过一些内置的LDAP服务器实现功能,如密码过期和入侵检测。

JNDI Samples

答案 1 :(得分:1)

Java LDAP API提供search操作,从而导致LDAP比较。这是an example of the same

答案 2 :(得分:0)

如果在您的应用程序中有一个使用Spring Security的选项,那么它有一个模块,允许您将身份验证与LDAP集成。

Documentation here

答案 3 :(得分:0)

你问的是错误的问题。使用LDAP的正确方法是使用用户的凭据而不是您自己的凭据“绑定”到目录。在JNDI中,这对应于LdapContext.reconnect()操作,在将用户凭据设置为上下文环境Context.SECURITY_PRINCIPALContext.SECURITY_CREDENTIALS.之后,这会导致LDAP服务器根据需要进行密码比较。

答案 4 :(得分:0)

如果您确实想要比较某个字段(不限于用户名和密码),则可以使用以下包装而不是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否则。在这种情况下,如果您检查answer方法中的compare,您会看到:

    SearchResult sr = answer.next();
    sr.getName();                      // this is empty
    sr.getAttributes();                // No attributes
    

您还可以查看LDAP Compare documentation from Oracle

答案 5 :(得分:-1)

如果我理解正确,您试图比较用户输入的密码和Java代码中LDAP的密码。这在JAVA中是不可能的,因为java没有从LDAP检索密码的选项。我们只能要求LDAP验证用户输入的详细信息。超过LDAP中的密码不会以纯文本形式存储,它将被加密和存储。