ldap通过java检查用户名 - 密码组合

时间:2011-09-22 15:47:44

标签: java authentication ldap jndi

要使用ldap测试用户名 - 密码组合,请执行以下操作

  1. 使用masteruser帐户连接到ldap服务器
  2. 搜索用户以查看
  3. 使用InitialLdapContext和给定的组合打开另一个连接。
  4. 这对我来说很好,直到我注意到一些正确的组合无法正常工作。 (这些主要是很久以前创建的帐户)

    有没有办法在ldap目录中列出用户但是不允许连接到ldap服务器本身?!我当前的代码只是使用masteruser来搜索要检查的用户名,但最后它只是一个与用户名 - 密码组合的新连接来检查。

    我是否应该与masteruser连接,然后使用用户名 - 密码组合进行绑定?

    这是我检查组合的部分:

    static boolean CheckLDAPConnection(String user_name, String user_password) {    
        try {
            Hashtable<String, String> env1 = new Hashtable<String, String>();
            env1.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env1.put(Context.SECURITY_AUTHENTICATION, "simple");
            env1.put(Context.SECURITY_PRINCIPAL, user_name);
            env1.put(Context.SECURITY_CREDENTIALS, user_password);
            env1.put(Context.PROVIDER_URL, ip);
            try {
                //Connect with ldap
                new InitialLdapContext(env1, null);  
    
                //Connection succeeded
                System.out.println("Connection succeeded!");
                return true;
            } catch (AuthenticationException e) {
    
                //Connection failed
                System.out.println("Connection failed!");
                e.printStackTrace();
                return false;
            }  
        }
        catch (Exception e) {   
        }
        return false;
    }
    

2 个答案:

答案 0 :(得分:3)

找到用户的DN后,您应该将这些凭据添加到第一个上下文的环境中,然后尝试重新连接()。这就是LDAP绑定操作。

答案 1 :(得分:0)

我们通过直接使用其用户和密码来检查用户和密码以创建LDAP连接。如果可以创建连接,则授权使用。然后使用相同的连接在LDAP中搜索用户权限(如果没有权限无法访问有关用户的应用程序的验证)。这可能不是最好的方法,但在2层应用程序中无法使用主用户创建第一个LDAP连接(安全性问题关于将主用户存储在客户端GUI中),如我们的情况。

也许你可以改变你的方法。

这种方法在创建新用户时有一些缺点,因此需要将LDAP的特殊权限授予GUI的“admin”用户以创建其他用户但不管理LDAP ...