两个Java类 一个XML配置: 1.LdapAuthenticate.Java import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import org.apache.log4j.Logger; //authenticate method public class LdapAuthenticate { String context = ""; String url = ""; String userid_suffix = ""; private static Logger logger = Logger.getLogger(LdapAuthenticate.class); public boolean login(String username, String password) { boolean isValidUser = false; DirContext ctx = null; try { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, context); env.put(Context.PROVIDER_URL, url); env.put(Context.SECURITY_PRINCIPAL, username + userid_suffix); env.put(Context.SECURITY_CREDENTIALS, password); ctx = new InitialDirContext(env); isValidUser = true; } catch (NamingException e) { logger.warn("Failed to do authenticate in directory server"); } catch (Exception e) { logger.error("Failed to get connection to directory server", e); } finally { try { if (ctx != null) ctx.close(); } catch (Exception ignore) { } } return isValidUser; } public String getContext() { return context; } public void setContext(String context) { this.context = context; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUserid_suffix() { return userid_suffix; } public void setUserid_suffix(String userid_suffix) { this.userid_suffix = userid_suffix; } } 2.LdapSearch.Java import java.util.Hashtable; import java.util.Map; import java.util.Vector; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import org.apache.log4j.Logger; import com.nomura.entadm.idxref.IDXrefConst; import com.nomura.entadm.idxref.model.ldapProfile; import com.nomura.entadm.idxref.util.MWStringUtils; public class LdapSearch { /** * @param args */ private String LDAP_URL; private String BIND_DN; private String contextFactory; private String attributeType; private Map returnAttribute; private int SEARCH_SCOPE = SearchControls.SUBTREE_SCOPE; private Logger logger = Logger.getLogger(LdapSearch.class); public DirContext getDirContext() throws Throwable{ final Hashtable lEnvVars = new Hashtable(2); lEnvVars.put( Context.INITIAL_CONTEXT_FACTORY, contextFactory ); lEnvVars.put( Context.PROVIDER_URL, LDAP_URL ); // lEnvVars.put( Context.SECURITY_PRINCIPAL, LDAP_USERNAME ); // lEnvVars.put( Context.SECURITY_CREDENTIALS, LDAP_PASSWD ); final DirContext lContext = new InitialDirContext(lEnvVars); return lContext; } public Vector doSearch(String xpid, String firstname, String lastname) throws Throwable{ return doSearchFuzzy(xpid, firstname, lastname, true); } /** * @param xpid * @param firstname * @param lastname * @param isFuzzy * @return * @throws Throwable */ public Vector doSearchFuzzy(String xpid, String firstname, String lastname, boolean isFuzzy) throws Throwable{ final DirContext lContext = this.getDirContext(); final SearchControls lSearchControls = new SearchControls(); String[] RETURN_ATTRIB_ARRAY={(String) returnAttribute.get(IDXrefConst.EMPLOYEE_NAME),(String) returnAttribute.get(IDXrefConst.XPID),(String) returnAttribute.get(IDXrefConst.HRID),(String) returnAttribute.get(IDXrefConst.DEPARTMENET),(String) returnAttribute.get(IDXrefConst.ENTITY)} ; lSearchControls.setReturningAttributes(RETURN_ATTRIB_ARRAY); lSearchControls.setSearchScope(SEARCH_SCOPE); Vector result= new Vector(); StringBuffer search_filter = buildFilter(xpid, firstname, lastname, isFuzzy); if (logger.isInfoEnabled()) { logger.info(search_filter.toString()); } try { final NamingEnumeration lResultEnum = lContext.search(BIND_DN,search_filter.toString(), lSearchControls); while ( lResultEnum.hasMore() ) { SearchResult lSearchResult = (SearchResult) lResultEnum.next(); result.add(getProfile(lSearchResult)); } if (logger.isInfoEnabled()) { logger.info("----------- result size == " + result.size() + " ----------- "); } return result; } finally{ lContext.close(); } } /** * @param xpid * @param firstname * @param lastname * @param isFuzzy * @return */ private StringBuffer buildFilter(String xpid, String firstname, String lastname, boolean isFuzzy) { StringBuffer search_filter = new StringBuffer(); if (isFuzzy) { search_filter.append("(&").append("(").append((String) returnAttribute.get(IDXrefConst.XPID)).append("="); if(xpid != null){ if (!"".equals(xpid)) search_filter.append(xpid); } search_filter.append("*)"); search_filter.append("(").append(IDXrefConst.CN).append("="); if (!MWStringUtils.empty(firstname)) { search_filter.append(firstname); } search_filter.append("*"); if (MWStringUtils.empty(lastname)) { search_filter.append(" ").append("*"); } else { search_filter.append(" ").append(lastname).append("*"); } search_filter.append(")"); } else { search_filter.append("(&(").append(IDXrefConst.XPID).append("="); if(!MWStringUtils.empty(xpid)){ search_filter.append(xpid); } else { search_filter.append("*"); } search_filter.append(")"); String name = lastname + firstname; if (name != null && name.length() != 0) { search_filter.append("("); search_filter.append(IDXrefConst.CN).append("="); if (!MWStringUtils.empty(firstname)) { search_filter.append(firstname).append(" "); } if (!MWStringUtils.empty(lastname)) { search_filter.append(lastname).append(""); } search_filter.append(")"); } } search_filter.append(")"); return search_filter; } public ldapProfile getProfile( SearchResult lSearchResult ) throws Throwable{ Attributes pRowAttribs=lSearchResult.getAttributes(); //formatAttributes( pRowAttribs ); //System.out.println("==================================================="); if ( pRowAttribs == null ) { return null; } else { ldapProfile profile= new ldapProfile(); Attribute attrib; profile.setLdapType(attributeType); attrib = pRowAttribs.get((String) returnAttribute.get(IDXrefConst.XPID)); if (attrib != null) { profile.setXpid((String) attrib.getAll().next()); } attrib = pRowAttribs.get((String) returnAttribute.get(IDXrefConst.EMPLOYEE_NAME)); if (attrib != null) { profile.setFullName((String) attrib.getAll().next()); } attrib = pRowAttribs.get((String) returnAttribute.get(IDXrefConst.ENTITY)); if (attrib != null) { profile.setLegalEntity((String) attrib.getAll().next()); } attrib = pRowAttribs.get((String) returnAttribute.get(IDXrefConst.DEPARTMENET)); if (attrib != null) { profile.setDepartment((String) attrib.getAll().next()); } attrib = pRowAttribs.get((String) returnAttribute.get(IDXrefConst.HRID)); if (attrib != null) { profile.setHRID((String) attrib.getAll().next()); } return profile; } } public void formatResults( final NamingEnumeration pResultEnum ) throws Throwable{ int lCount = 0; while ( pResultEnum.hasMore() ) { final SearchResult lSearchResult = (SearchResult) pResultEnum.next(); System.out.println("Base Dn=" + lSearchResult.getName()); formatAttributes( lSearchResult.getAttributes()); System.out.println("===================================================="); lCount++; } System.out.println("Search returned "+ lCount+ " results"); } /* * Generic method to format the Attributes .Displays all the multiple values of * each Attribute in the Attributes */ public void formatAttributes( final Attributes pRowAttribs ) throws Throwable{ if ( pRowAttribs == null ) { System.out.println("This result has no attributes"); } else { for ( final NamingEnumeration lEnum = pRowAttribs.getAll(); lEnum.hasMore();) { final Attribute attrib = (Attribute)lEnum.next(); System.out.println(" ATTRIBUTE :" + attrib.getID()); for ( final NamingEnumeration e = attrib.getAll(); e.hasMore();) System.out.println(" /t/t = " + e.next()); } } } public String getLDAP_URL() { return LDAP_URL; } public void setLDAP_URL(String ldap_url) { LDAP_URL = ldap_url; } public String getBIND_DN() { return BIND_DN; } public void setBIND_DN(String bind_dn) { BIND_DN = bind_dn; } public String getContextFactory() { return contextFactory; } public void setContextFactory(String contextFactory) { this.contextFactory = contextFactory; } public String getAttributeType() { return attributeType; } public void setAttributeType(String attributeType) { this.attributeType = attributeType; } public Map getReturnAttribute() { return returnAttribute; } public void setReturnAttribute(Map returnAttribute) { this.returnAttribute = returnAttribute; } } 3.Const.Java public static final String CN = "cn"; public static final String EMPLOYEE_NAME = "NAME"; public static final String XPID = "uid"; public static final String USERNAME = "USERNAME"; public static final String DEPARTMENT = "DEPARTMENT"; public static final String PWD = "pwd"; public static final String HRID = "HRID"; public static final String DEPARTMENET = "DEPT"; public static final String FINANCE_DEPARTMENET = "FINADEPT"; public static final String DIVISION = "DIV"; public static final String ENTITY = "ENT"; public static final String FIRSTNAME = "firstname"; public static final String LASTNAME = "lastname"; public static final String ISFUZZY = "isFuzzy"; public static final String LDAP_LOGIN = "ldapLogin"; public static final String LDAP_TYPE = "ldapType"; public static final String GCD = "NMR"; 4.Test.xml <bean id="TEST_LDAP" class="test.LdapAuthenticate"> <property name="context" value="com.sun.jndi.ldap.LdapCtxFactory"> </property> <property name="url" value="ldap://host:389"></property> <property name="userid_suffix" value="uid=$,ou=people,l=ap,o=test.com"></property> </bean> <bean id="TESTLdapSearchBean" class="test.LdapSearch"> <property name="LDAP_URL" value="ldap://host:389"/> <property name="BIND_DN" value="o=test.com"/> <property name="contextFactory" value="com.sun.jndi.ldap.LdapCtxFactory"/> <property name="attributeType" value="NMR"/> <property name="returnAttribute"><map> <entry key="NAME"><value>cn</value></entry> <entry key="uid"><value>uid</value></entry> <entry key="HRID"><value>employeeNumber</value></entry> <entry key="DEPT"><value>ngbdepartment</value></entry> <entry key="FINADEPT"><value>ngbdivision</value></entry> <entry key="DIV"><value>ngbdivision</value></entry> <entry key="ENTITY"><value>ngbgspecode</value></entry> </map></property> </bean>