我使用下面的代码来验证独立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毫秒。任何建议都会有所帮助。
提前致谢。
答案 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)
LdapContext.reconnect()
,但在引擎盖下它将完成同样的事情。