import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Hashtable; import java.util.Properties; import javax.naming.Context; import javax.naming.NameClassPair; import javax.naming.NamingEnumeration; import javax.naming.NamingException; 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 javax.naming.ldap.Control; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; import javax.naming.ldap.SortControl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.phicomm.vo.User; //import com.util.Constant; /** * LDAP Connector seems like JDBC, supposed to interface with AD. * * Use singleton pattern to prevent multi-instances. * */ public class LDAPConnector { private static LDAPConnector instance; private String url; private String baseDN; private String bindDN; private String bindPassword; private final Hashtable<String, String> env = new Hashtable<String, String>(); private final Control[] sortConnCtls = new SortControl[1]; { try { sortConnCtls[0] = new SortControl("sAMAccountName", Control.CRITICAL); } catch (IOException ex) { } } private LDAPConnector() { try { InputStream in = LDAPConnector.class.getClassLoader().getResourceAsStream("ldap.properties"); Properties properties = new Properties(); properties.load(in); url = properties.getProperty("url"); baseDN = properties.getProperty("baseDN"); bindDN = properties.getProperty("bindDN"); bindPassword = properties.getProperty("bindPassword"); // set up environment for creating initial context env.put(Context.PROVIDER_URL, url + baseDN); env.put(Context.SECURITY_PRINCIPAL, bindDN); env.put(Context.SECURITY_CREDENTIALS, bindPassword); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put("java.naming.batchsize", "50"); env.put("com.sun.jndi.ldap.connect.timeout", "3000"); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put("com.sun.jndi.ldap.connect.pool", "true"); // the following pool parameters doesn't work // must setup as java init parameters env.put("com.sun.jndi.ldap.connect.pool.maxsize", "3"); env.put("com.sun.jndi.ldap.connect.pool.prefsize", "1"); env.put("com.sun.jndi.ldap.connect.pool.timeout", "300000"); env.put("com.sun.jndi.ldap.connect.pool.initsize", "1"); env.put("com.sun.jndi.ldap.connect.pool.authentication", "simple"); } catch (Exception e) { // ignore error e.printStackTrace(); } } public static LDAPConnector getInstance() { if (instance == null) instance = new LDAPConnector(); return instance; } //验证用户 public boolean validateUser(String username, String password) { boolean passed = false; LdapContext dirContext = null; try { // create initial context dirContext = new InitialLdapContext(env, sortConnCtls); dirContext.setRequestControls(sortConnCtls); SearchControls controls = new SearchControls(); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter = "(sAMAccountName=" + username + ")"; NamingEnumeration<?> answer = dirContext.search("", filter, controls); String userDN = null; while (answer.hasMoreElements()) { //获得用户DN userDN = ((NameClassPair) answer.nextElement()).getName(); } // set up environment for creating initial context Hashtable<String, String> env = new Hashtable<String, String>(); env.put(Context.PROVIDER_URL, url + baseDN); env.put(Context.SECURITY_PRINCIPAL, userDN + "," + baseDN); env.put(Context.SECURITY_CREDENTIALS, password); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put("com.sun.jndi.ldap.connect.timeout", "1000"); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); // create initial context DirContext context = new InitialDirContext(env); passed = true; context.close(); } catch (NamingException e) { // ignore error //e.printStackTrace(); } finally { if (dirContext != null) { try { dirContext.close(); } catch (NamingException e) { e.printStackTrace(); } } } return passed; } //获得用户信息 public User getUser(String username){ LdapContext dirContext = null; User user = null; try { // create initial context dirContext = new InitialLdapContext(env, sortConnCtls); dirContext.setRequestControls(sortConnCtls); SearchControls controls = new SearchControls(); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter = "(sAMAccountName=" + username + ")"; NamingEnumeration<?> answer = dirContext.search("", filter, controls); while (answer.hasMoreElements()) { user = new User(); //获得用户信息 SearchResult sr = (SearchResult) answer.nextElement(); Attributes Attrs = sr.getAttributes(); user.setName(username); String truename = Attrs.get("name")+""; user.setTruename(truename.substring(truename.indexOf(":")).trim()); String mail = Attrs.get("mail")+""; user.setEmail(mail.substring(mail.indexOf(":")).trim()); } } catch (NamingException e) { // ignore error //e.printStackTrace(); } finally { if (dirContext != null) { try { dirContext.close(); } catch (NamingException e) { e.printStackTrace(); } } } return user; } }
配置文件ldap.properties:
url=ldap://127.0.0.1:389/ baseDN = DC=networks,DC=com bindDN = cloudadmin02 bindPassword =########
相关推荐
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于...
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于...
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供...
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于...
java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于...