一种在java代码中定义/实现故障转移ldap服务器的方法

时间:2016-10-24 12:31:01

标签: java active-directory ldap

我有以下Ldap用户身份验证代码:

import java.util.Hashtable;
import javax.naming.*;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;


public class LdapUtil {
    public static final String PROVIDER_URL= "ldap://ourLdapServer";
    public static final String SECURITY_AUTHENTICATION="simple";
    public static final String SECURITY_PRINCIPAL_POSTFIX="@org.local";
    private String ldapAttributes[] = null;

    public boolean isCorrectUser(String user, String pass){
        boolean result = false;
        if (user == null || pass == null || "".equals(user) || "".equals(pass)) {
            return result;
        }
    try {
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, PROVIDER_URL);
            env.put(Context.SECURITY_AUTHENTICATION, SECURITY_AUTHENTICATION);
            env.put(Context.SECURITY_PRINCIPAL, user + SECURITY_PRINCIPAL_POSTFIX);
            env.put(Context.SECURITY_CREDENTIALS, pass);
            LdapContext ctxGC = new InitialLdapContext(env, null);
            ldapAttributes = getUserBasicAttributes(user,ctxGC);
            ctxGC.close();
            result = true;
            //System.out.println("LDAP authentication for " + username + " succeeded!");
        } catch (Exception e) {
            // Not authenticated
            result = false;  
           //System.out.println("LDAP authentication for " + username + " failed!");

        }
     return result;
    }

}

有一个主要缺点 - 它仅适用于一个 Ldap服务器。

现在我想为故障转移目的定义备用Ldap服务器(例如,当主ldap关闭或无法访问时 - 程序应该尝试查询辅助ldap,如果下一个不可用,等等) 。

我将如何实现这一目标?

如果主服务器长时间保持脱机状态,我将如何最小化身份验证时间?

提前致谢。

1 个答案:

答案 0 :(得分:4)

只需添加多个LDAP PROVIDER_URL:

// Specify list of [space-separated URL][1]s
env.put(Context.PROVIDER_URL, 
    "ldap://ourLdapServer " +
    "ldap://ourLdapServer2 " + 
    "ldap://ourLdapServer3 " +
    "ldap://ourLdapServer4");