LDAPS从Java绑定性能

时间:2014-10-16 20:25:54

标签: java ldap

我使用下面的代码来验证独立java应用程序中的用户:

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.directory.InitialDirContext;


public class Authenticate
{
public static void main(String[] args)
{
    try
    {
        Hashtable<String, String> env = new Hashtable<String, String>();

        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "LDAPS://my_ldap_server:636");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL,
            "CN=0@0.com,CN=myCustomers,CN=PartX,DC=testCom,DC=local");
        env.put(Context.SECURITY_CREDENTIALS, "user_password");
        env.put(Context.SECURITY_PROTOCOL, "ssl");

        for (int i = 0; i < 50; i++)
        {
            long start = System.currentTimeMillis();
            new InitialDirContext(env);
            // send request, wait for response
            long end = System.currentTimeMillis();
            System.out.println("Round trip response time = "
                + (end - start) + " millis");
        }

        System.out.println("Welcome");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
}

每个绑定的响应时间接近200 ms,非常高。我的问题是其他人在从java执行LDAP绑定时看到的响应时间。

必须有其他方法将用户绑定到LDAP。请分享您的方法。我有一个绑定操作的.NET实现,它执行大约20毫秒。任何建议都会有所帮助。

提前致谢。

2 个答案:

答案 0 :(得分:0)

根据Oracle的LDAP / LDAPS身份验证实现 - 无论是否有连接池 - 都会创建一个LDAPClient。此lDAPClient创建LDAPConnection,并在执行绑定/身份验证后关闭连接。

如果连接池属性设置为true,则仅当安全主体和密码相同时,才使用池连接。

对于具有一百万用户的Web应用程序,我们不应该池连接。这会使ldap服务器超载。

ldap客户端和连接代码位于java rt.jar中。在ldaps / ssl的情况下,观察到与没有ssl的ldap相关的延迟。

如果找到一种方法,指示ldap客户端使用相同的ldap连接对象 - 就像我们使用jdbc连接一样 - 那么ldap身份验证可以大大优化。

当我们尝试仅搜索用户时,Ldap连接池是有意义的,而不是在我们尝试执行身份验证时。

简而言之,我同意原始海报。使用LDAPS身份验证时会出现性能延迟。我也想听听其他人的经历。

答案 1 :(得分:-1)

  1. 您的测试无效。您没有关闭InitialContext。在普通系统中,您可能会启用LDAP连接池,这将完全改变图片。
  2. LDAP绑定不是一个确定速率的步骤,但我确信我的速度要快于此。
  3. 在Java JNDI中通过LDAP绑定的唯一另一种方法是通过LdapContext.reconnect(),但在引擎盖下它将完成同样的事情。