private Authentication authenticateUserPassword(UsernamePasswordAuthenticationToken token) throws NamingException {
Object login = login(token);
LOGGER.debug("Starting authentication login='{}'", login);
Object password = token.getCredentials();
LdapContext ctx = createLdapCtx(login, password);
SearchControls ctrls = createSearchControls();
String filter = String.format(this.filter, login);
NamingEnumeration<SearchResult> ne = ctx.search(dn, filter, ctrls);
....
我有以下方法登录用户。这取决于LDAP。有时它挂在最后一排。我不知道为什么。它有时会在性能测试中重现。
有没有办法等待一段时间,如果方法没有响应 - 返回一些预定义的值?
P.S。
private LdapContext createLdapCtx(Object login, Object password) throws NamingException {
Hashtable<String, String> props = new Hashtable<String, String>();
props.put(Context.INITIAL_CONTEXT_FACTORY, factory);
props.put(Context.PROVIDER_URL, url);
props.put(Context.SECURITY_AUTHENTICATION, "simple");
props.put(Context.SECURITY_PRINCIPAL, String.format(domain, login));
props.put(Context.SECURITY_CREDENTIALS, password.toString());
return new InitialLdapContext(props, null);
}
答案 0 :(得分:3)
您可以设置time-out for all Ldap operations:
新的环境属性:
com.sun.jndi.ldap.read.timeout
可用于指定LDAP操作的读取超时。此属性的值是一个整数的字符串表示形式,表示LDAP操作的读取超时(以毫秒为单位)。
因此,您只需更新createLdapCtx
方法,将环境变量指定为您选择的值:
props.put("com.sun.jndi.ldap.read.timeout", "1000"); // 1 second of timeout here
如果服务器在1秒内没有响应,这将导致LDAP服务提供程序中止读取尝试。如果达到超时,则会设置NamingException
。
请注意,从this Stack Overflow post开始,您无法使用方法SearchControls.setTimeLimit
,因为此参数不适用于读取超时。
答案 1 :(得分:0)
您的SearchControl很可能有一种设置超时的方法。你能检查一下吗?你应该可以做ctrls.setTimeLimit(ms);