使用LDAP和Java进行用户身份验证

问题描述 投票:0回答:1

我正在尝试使用LDAP对用户进行身份验证。但是,密码是在LDAP中散列的SSHA。当我向ldap发送明文密码时,如何验证uid和密码。这是我的代码

Properties initialProperties=new Properties();
    initialProperties.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    initialProperties.put(Context.PROVIDER_URL,"ldap://localhost:10389");
    initialProperties.put(Context.SECURITY_AUTHENTICATION,"simple");
    initialProperties.put(Context.SECURITY_PRINCIPAL,"uid=admin,ou=system");
    initialProperties.put(Context.SECURITY_CREDENTIALS,"secret");

    NamingEnumeration<?> results = null;

    try
    {
        DirContext ctx = new InitialDirContext(initialProperties);
        System.out.println(ctx+"222 success");
        SearchControls controls = new SearchControls();
        controls.setSearchScope(SearchControls.SUBTREE_SCOPE);

        String filter = "(&(objectClass=inetOrgPerson)(uid=" + uID + ")(userPassword="+pwd+")";
        results = ctx.search("", filter, controls);
        if (results.hasMore()) {
            System.out.println("User found");
            return true;
          } else {
            System.out.println("User not found");
            return false;
          }

    }
    catch (Exception e)
    {
        return false;
    }

sysout总是找不到用户,因为它无法将明文密码与ssha哈希密码相匹配?如何在发送到ldap之前将密码转换为SSHA?这是解决此问题的正确方法吗?

java openldap
1个回答
0
投票

您应该使用ContextSource.getContext(principal, credentials)来验证用户身份。

获取使用提供的主体和凭据进行身份验证的DirContext实例。通常用于普通认证目的。请注意,此方法永远不会使用本机Java LDAP池,即使此实例已配置为执行此操作。这是为了强制目标目录中的密码更改尽快生效。

出于安全原因,密码是经过哈希处理的,您应始终遵从LDAP服务器对用户进行身份验证,这是其中一个主要用途。

© www.soinside.com 2019 - 2024. All rights reserved.