Java LDAP - 无法对用户进行身份验证

时间:2016-10-03 11:15:49

标签: java ldap jndi liferay-6 opendj

我遇到问题需要尽快解决,需要你的帮助。

我有一个非常简单的java程序,仅用于ldap用户的样本认证

问题-1 - :

public static void main(String[] args) throws NamingException {

        final String ldapAdServer = "ldap://0.0.0.0:389";


        final String ldapUsername = "uid=test,ou=People,dc=example,dc=com";
        final String ldapPassword = "gdyb21LQTcIANtvYMT7QVQ==";


        Hashtable<String, Object> env = new Hashtable<String, Object>();
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        if (ldapUsername != null) {
            env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
        }
        if (ldapPassword != null) {
            env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
        }
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldapAdServer);

        env.put("java.naming.ldap.attributes.binary", "objectSID");
        DirContext ctx = new InitialDirContext(env);

    }

运行上面的程序会出现“[LDAP:错误代码49 - 无效凭据]”错误我也已经对ldap用户进行了导出,userPassword与在程序中输入的相同

dn: uid=test,ou=People,dc=example,dc=com objectClass: person objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: top uid: test mail: test@yopmail.com userPassword: {MD5}gdyb21LQTcIANtvYMT7QVQ==

我上面输入的密码和java代码抛出错误另外我使用了dsconfig并配置了“default-password-storage-scheme”来使用MD5,当我只提供普通密码但我需要的时候同样适用将MD5十六进制密码传递给ldap以进行身份​​验证。

问题2 - : 我们使用liferay作为后端系统,如果用户正在更改密码,所有用户的详细信息必须存储在ldap中liferay使用MD5和十六进制编码生成密码“098f6bcd4621d373cade4e832627b4f6 “但是当使用export ldiff选项导出相同时,我们在ldap”{MD5} gdyb21LQTcIANtvYMT7QVQ ==“中出现这样的情况。在liferay和ldap生成的密码之间存在不匹配我希望liferay md5密码进入ldap。 再次输入从ldiff文件获得的相同密码,并将其放在java程序中似乎不起作用,并且明文密码可以正常工作。

需要认真帮助。

如果需要任何其他信息,请随意。

1 个答案:

答案 0 :(得分:3)

您的代码没有任何问题。问题是OpenDJ期望明文密码而不是散列值(这是你正在使用的)。

当OpenDJ收到绑定请求(绑定请求是用户如何对LDAP服务器进行身份验证)时,它将从请求中获取密码,计算哈希值,并将其与存储在 userPassword <中的值进行比较/ em>属性( gdyb21LQTcIANtvYMT7QVQ == 在您的情况下)。请注意,OpenDJ会预先添加最初使用的哈希算法(MD5,SHA1等)。

因此,使用明文密码应修复问题1

上述说明还应该说明导致问题2 的原因。 Liferay在修改OpenDJ中的 userPassword 属性时传递密码哈希。然而,OpenDJ认为它接收到明文值,因此它会再次出现密码。因此,你最终会得到一个&#34; double hashed&#34; LDAP服务器中的密码。

您有两种方法可以解决问题2:

  • 在Liferay中禁用散列,让OpenDJ进行散列。
  • 在LDAP中允许预先编码的密码,并将Liferay配置为以二进制格式传递密码值。要允许预先编码的密码,您只需将 allow-pre-encoded-passwords 高级密码策略属性设置为 true 即可。我恐怕无法帮助你使用Liferay配置。