2014-10-16 49 views
0

我用下面的代码从一个独立的Java应用程序验证用户身份的性能:LDAPS绑定从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, 
      "[email protected],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毫秒,这是非常高的响应时间。我的问题是别人在从java执行LDAP绑定时看到的响应时间。

必须有其他方法将用户与LDAP绑定。请分享你的方法。我有一个绑定操作的.NET实现,它在大约20毫秒时执行。任何的意见都将会有帮助。

在此先感谢。

+0

您好专家。请输入其他任何内容?特别是针对其他绑定用户的java实现看到的响应时间。 – Aspirant 2014-10-28 17:49:23

回答

-1
  1. 您的测试无效。您没有关闭InitialContext。在一个正常的系统中,你可能会启用LDAP连接池,这将完全改变图像。
  2. LDAP绑定不是一个决定速度的步骤,但我很确定我的速度比这更快。
  3. 在Java JNDI中通过LDAP进行绑定的唯一方法是通过LdapContext.reconnect()进行绑定,但是在底层,它将在线路上完成相同的事情。
+0

@downvoter为什么? – EJP 2014-10-18 00:07:30

0

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

如果连接池属性设置为true,那么只有当安全主体和密码相同时,才会使用池连接。

对于拥有一百万用户的网络应用程序,我们不应该联网。这会使ldap服务器过载。

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

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

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

总之,我同意原始海报。使用LDAPS身份验证时会出现性能延迟。我也想听听别人的经验。

+0

连接池连接将如何超载LDAP服务器,而不是连接池会超载吗?连接池与“指示ldap客户端使用相同的ldap连接对象的方式”有什么不同? – EJP 2014-10-17 03:20:53