从Java应用程序连接LDAP服务器

我正在构建一个基于GXT(J2EE)的应用程序。 现在的问题是我必须将应用程序连接到LDAP服务器。 你能告诉我如何连接我们的Java应用程序中的LDAP服务器以及我必须使用的库或API吗?

要连接到LDAP,请查看以下包/类:

javax.naming.directory.* javax.naming.ladp.* com.sun.jndi.ldap.LdapCtxFactory com.sun.jndi.ldap.ControlFactory 

示例代码:

 //build a hashtable containing all the necessary configuration parameters Hashtable environment = new Hashtable(); environment.put(LdapContext.CONTROL_FACTORIES, conf.getProperty("ldap.factories.control")); environment.put(Context.INITIAL_CONTEXT_FACTORY, conf.getProperty("ldap.factories.initctx")); environment.put(Context.PROVIDER_URL, conf.getProperty("ldap.host")); environment.put(Context.SECURITY_AUTHENTICATION, "simple"); environment.put(Context.SECURITY_PRINCIPAL, conf.getProperty("ldap.user")); environment.put(Context.SECURITY_CREDENTIALS, conf.getProperty("ldap.password")); environment.put(Context.STATE_FACTORIES, "PersonStateFactory"); environment.put(Context.OBJECT_FACTORIES, "PersonObjectFactory"); // connect to LDAP DirContext ctx = new InitialDirContext(environment); // Specify the search filter String FILTER = "(&(objectClass=Person) ((sAMAccountName=" + user.getUsername() + ")))"; // limit returned attributes to those we care about String[] attrIDs = { "sn", "givenName" }; SearchControls ctls = new SearchControls(); ctls.setReturningAttributes(attrIDs); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Search for objects using filter and controls NamingEnumeration answer = ctx.search(searchBase, FILTER, ctls); ... SearchResult sr = (SearchResult) answer.next(); Attributes attrs = sr.getAttributes(); surName = attrs.get("sn").toString(); givenName = attrs.get("givenName").toString(); ... 

在这个例子中,我有一个Configuration对象,它从配置文件中读取这些值。

价值观将是:

 # LDAP parameters ldap.host = ldap://ldap.mydomain.com:389 ldap.factories.initctx = com.sun.jndi.ldap.LdapCtxFactory ldap.factories.control = com.sun.jndi.ldap.ControlFactory ldap.searchbase = dc=mydomain,dc=us ldap.user = MYDOMAIN.COM\\ldap-user ldap.userBase= MYDOMAIN.COM\\ ldap.password = ****** 
  • 使用Java中的JNDI(Java命名和目录接口)API建立与LDAP服务器的连接。
  • JDK提供了以下软件包中的JNDI接口,类和exception:

    • javax.naming中。*
    • javax.naming.directory。*
  • 这意味着在大多数情况下,我们不必使用任何外部库来处理LDAP服务器。

  • 这指定LDAP服务器的URL由LDAP服务器运行端口号的主机名组成。 轻量级目录访问协议的众所周知的端口号是389,这是默认的。

  • 还需要为Hashtable对象中的连接和身份validation指定一些环境属性。

以下是示例代码:

 import javax.naming.*; import javax.naming.ldap.*; import javax.naming.directory.*; public class Ldap { public static void main(String[]args) { Hashtable environment = new Hashtable(); environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); environment.put(Context.PROVIDER_URL, "ldap://:389"); environment.put(Context.SECURITY_AUTHENTICATION, "simple"); environment.put(Context.SECURITY_PRINCIPAL, ""); environment.put(Context.SECURITY_CREDENTIALS, ""); try { DirContext context = new InitialDirContext(environment); System.out.println("Connected.."); System.out.println(context.getEnvironment()); context.close(); } catch (AuthenticationNotSupportedException exception) { System.out.println("The authentication is not supported by the server"); } catch (AuthenticationException exception) { System.out.println("Incorrect password or username"); } catch (NamingException exception) { System.out.println("Error when trying to create the context"); } } } 

您甚至可以使用当前未处于活动状态但在LDAP编程中提供更多控制的Netscape LDAP SDK