用Java建立LDAP连接

时间:2019-07-10 19:37:32

标签: java active-directory ldap jndi

我正在尝试使用返回LdapContext并接受用户名,密码,域名和服务器参数的函数在Java中建立LDAP连接。不清楚这些参数的外观。

我正在尝试连接到此只读LDAP测试服务器。 http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/

我正在使用的getConnection方法是从我在这里找到的Active Directory类派生的。 http://www.javaxt.com/wiki/Tutorials/Windows/How_to_Authenticate_Users_with_Active_Directory

当前,我正在尝试getConnection(“ tesla”,“ password”,“ cn = read-only-admin,dc = example,dc = com”,“ ldap.forumsys.com:389”),这是不工作。我尝试切换域和服务器,以及尝试使用“ read-only-admin.example.com”而不是“ cn = ...”。

getConnection函数

public static LdapContext getConnection(String username, String password, String domainName, String serverName) throws NamingException {

        if (domainName==null){
            try{
                String fqdn = java.net.InetAddress.getLocalHost().getCanonicalHostName();
                if (fqdn.split("\\.").length>1) domainName = fqdn.substring(fqdn.indexOf(".")+1);
            }
            catch(java.net.UnknownHostException e){}
        }

        //System.out.println("Authenticating " + username + "@" + domainName + " through " + serverName);

        if (password!=null){
            password = password.trim();
            if (password.length()==0) password = null;
        }

        //bind by using the specified username/password
        Hashtable props = new Hashtable();
        String principalName = username + "@" + domainName;
        props.put(Context.SECURITY_PRINCIPAL, principalName);
        if (password!=null) props.put(Context.SECURITY_CREDENTIALS, password);


        String ldapURL = "ldap://" + ((serverName==null)? domainName : serverName + "." + domainName) + '/';
        props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        props.put(Context.PROVIDER_URL, ldapURL);
        try{
            return new InitialLdapContext(props, null);
        }
        catch(javax.naming.CommunicationException e){
            throw new NamingException("Failed to connect to " + domainName + ((serverName==null)? "" : " through " + serverName));
        }
        catch(NamingException e){
            throw new NamingException("Failed to authenticate " + username + "@" + domainName + ((serverName==null)? "" : " through " + serverName));
        }
    }

我尝试连接

try{
                LdapContext ctx =  ActiveDirectory.getConnection("tesla", "password", "cn=read-only-admin,dc=example,dc=com", "ldap.forumsys.com:389");
                ctx.close();
            }
            catch(Exception e){
                //Failed to authenticate user!
            }

它捕获到异常“ javax.naming.CommunicationException”。

1 个答案:

答案 0 :(得分:0)

问题是您正在尝试使用非标准的用户名进行身份验证(该用户名适用于AD,但不适用于OpenLDAP)。

String principalName = username + "@" + domainName;
props.put(Context.SECURITY_PRINCIPAL, principalName);

使用OpenLDAP并按照本教程中的说明,principalName应该为uid=tesla,dc=example,dc=com