import javax.naming.NamingException; public interface Ldap { public void connect() throws NamingException; public void search() throws NamingException; public void update() throws NamingException; public void add() throws NamingException; public void delete() throws NamingException; public void close() throws NamingException; } import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.ModificationItem; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; public class LdapImpl implements Ldap { private DirContext ds; @Override public void search() throws NamingException { System.out.println("Searching..."); SearchControls searchCtls = new SearchControls(); // Specify the search scope searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); // specify the LDAP search filter String searchFilter = "uid=test"; // Specify the Base for the search //String searchBase = "dc=ibm,dc=com"; String searchBase = "o=tcl,c=cn"; // Specify the attributes to return String returnedAtts[] = { "cn"}; //可以查找多个属性 //String returnedAtts[] = { "cn","mail","userPassword","sn" }; searchCtls.setReturningAttributes(returnedAtts); // Search for objects using the filter NamingEnumeration<SearchResult> entries = ds.search(searchBase, searchFilter, searchCtls); // Loop through the search results while (entries.hasMoreElements()) { SearchResult entry = entries.next(); System.out.println(">>>" + entry.getName()); // Print out the groups Attributes attrs = entry.getAttributes(); if (attrs != null) { for (NamingEnumeration<? extends Attribute> names = attrs .getAll(); names.hasMore();) { Attribute attr = names.next(); System.out.println("AttributeID: " + attr.getID()); for (NamingEnumeration<?> e = attr.getAll(); e.hasMore();) { System.out.println("Attributes:" + e.next()); } } } } System.out.println("Search complete."); } @Override public void update() throws NamingException { System.out.println("Updating..."); ModificationItem[] mods = new ModificationItem[1]; Attribute attr = new BasicAttribute("cn", "changed value"); // Support add, replace and remove an attribute. mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr); // ds.modifyAttributes("uid=test,ou=tester,dc=ibm,dc=com", mods); ds.modifyAttributes("uid=test, o=tcl,c=cn", mods); System.out.println("Updated."); } @Override public void add() throws NamingException { System.out.println("Adding..."); Attributes attrs = new BasicAttributes(); attrs.put("uid", "test"); attrs.put("sn", "test"); attrs.put("cn", "test test"); attrs.put("userPassword", "111111".getBytes()); attrs.put("mail", "[email protected]"); attrs.put("labeledURI", "http://unmi.blogcn.com"); // the following attribute has two values Attribute objclass = new BasicAttribute("objectClass"); objclass.add("inetOrgPerson"); attrs.put(objclass); //this.ds.createSubcontext("uid=test,ou=tester,dc=ibm,dc=com", attrs); this.ds.createSubcontext("uid=test, o=tcl,c=cn", attrs); System.out.println("Add complete."); } @Override public void delete() throws NamingException { System.out.println("Deleting..."); //this.ds.destroySubcontext("uid=test,ou=tester,dc=ibm,dc=com"); this.ds.destroySubcontext("uid=test,o=tcl,c=cn"); System.out.println("Deleted."); } @Override public synchronized void connect() throws NamingException { System.out.println("connecting..."); if (ds == null) { Hashtable<String, Object> env = new Hashtable<String, Object>(11); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost:389"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); //env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=ibm,dc=com"); env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,o=tcl,c=cn" ); env.put(Context.SECURITY_CREDENTIALS, "secret"); ds = new InitialDirContext(env); // ds = (DirContext) initial.lookup("ldap://localhost:389"); } System.out.println("connected."); } @Override public void close() throws NamingException { System.out.println("closing..."); ds.close(); System.out.println("closed."); } } public class Factory { private static Ldap instance; public synchronized static Ldap createInstance() { if (instance == null) { try { instance = (Ldap) Class.forName("com.leech.ldap.LdapImpl").newInstance(); } catch (Exception e) { throw new RuntimeException(e); } } return instance; } } import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; public class LDAPTest { /** * @param args */ public static void main(String[] args) { try { test2(); } catch (NamingException e) { e.printStackTrace(); } } public static void test1(){ LDAPTest LDAPTest1 = new LDAPTest(); String root = "o=tcl,c=cn" ; //root Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" ); env.put(Context.PROVIDER_URL, "ldap://localhost/" + root); env.put(Context.SECURITY_AUTHENTICATION, "simple" ); env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,o=tcl,c=cn" ); env.put(Context.SECURITY_CREDENTIALS, "secret" ); DirContext ctx = null ; try { ctx = new InitialDirContext(env); System.out.println( "认证成功" ); } catch (javax.naming.AuthenticationException e) { e.printStackTrace(); System.out.println( "认证失败" ); } catch (Exception e) { System.out.println( "认证出错:" ); e.printStackTrace(); } if (ctx != null ) { try { ctx.close(); } catch (NamingException e) { //ignore } } } public static void test2()throws NamingException { Ldap ldap = Factory.createInstance(); ldap.connect(); try { // add uid=test,ou=tester,dc=ibm,dc=com ldap.add(); // search uid=test //ldap.search(); // update cn with new value of "changed name" //ldap.update(); // search uid=test to see cn value. //ldap.search(); // delete uid=test,ou=tester,dc=ibm,dc=com //ldap.delete(); // search again. ldap.search(); } finally { ldap.close(); } } }