正在与 Java 建立 LDAP 连接
Establishing LDAP Connection with Java
我正在尝试在 Java 中使用一个函数建立 LDAP 连接,该函数 returns 一个 LdapContext 并采用用户名、密码、域名和服务器的参数。不清楚这些参数应该是什么样子。
我正在尝试连接到这个只读 LDAP 测试服务器。
http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/
我使用的 getConnection 方法派生自我在此处找到的 Active Directory class。
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"。
问题是您正在尝试使用 non-standard 用户名进行身份验证(适用于 AD 但不适用于 OpenLDAP)。
String principalName = username + "@" + domainName;
props.put(Context.SECURITY_PRINCIPAL, principalName);
使用 OpenLDAP 并且如教程中所示,principalName 应该是 uid=tesla,dc=example,dc=com
我正在尝试在 Java 中使用一个函数建立 LDAP 连接,该函数 returns 一个 LdapContext 并采用用户名、密码、域名和服务器的参数。不清楚这些参数应该是什么样子。
我正在尝试连接到这个只读 LDAP 测试服务器。 http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/
我使用的 getConnection 方法派生自我在此处找到的 Active Directory class。 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"。
问题是您正在尝试使用 non-standard 用户名进行身份验证(适用于 AD 但不适用于 OpenLDAP)。
String principalName = username + "@" + domainName;
props.put(Context.SECURITY_PRINCIPAL, principalName);
使用 OpenLDAP 并且如教程中所示,principalName 应该是 uid=tesla,dc=example,dc=com