目标:使用者只需要会使用List,Map 数据结构,将对LDAP的操作进行封装 类:主要有三个类 1 Env类 包含LDAP的连接信息 2 LdapConnectionFactory类 ldap连接工厂,提供初始化及获取ldap连接的方法 3 LdapOperUtils ldap的处理工具类,提供了各种操作ldap的方法。 ldap连接工厂,提供初始化ldap连接的方法 package com.common.ldapconnection; import Java.util.Properties; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.Directory.DirContext; import javax.naming.directory.InitialDirContext; import org.apache.log4j.Logger; import org.apache.commons.lang.StringUtils; /** * 功能描述:ldap连接工厂,提供初始化ldap连接的方法。 * @author liaowufeng * @version 1.0 */ public class LdapConnectionFactory { // 初始化日志处理类 static Logger log = Logger.getLogger(LdapConnectionFactory.class.getName()); /** * 构造函数私有,防止实例化 */ private LdapConnectionFactory() { } /** * 从LDAP连接池中取得一个连接 * @param poolName String 连接池名 * @env 连接LDAP的连接信息 * @return DirContext */ public static DirContext getDirContext(String poolName,Env env) { // 取得Context try { // 日志打印,表明进入此方法 log.debug(Constants.INTOMETHOD + "getDirContext"); // 初始化Properties对象 Properties mEnv = new Properties(); // 使用LDAP/AD的认证方式 mEnv.put(Context.AUTHORITATIVE, "true"); // 使用连接池 mEnv.put("com.sun.jndi.ldap.connect.pool", "true"); // 设定LDAP/AD的连接工厂 mEnv.put(Context.INITIAL_CONTEXT_FACTORY, env.factory); // 设定LDAP/AD的url地址 mEnv.put(Context.PROVIDER_URL, env.url); // 设定连接TimeOut if(!StringUtils.isEmpty(env.timeOut)) { mEnv.put("com.sun.jndi.ldap.connect.timeout", env.timeOut); } // 设定安全模式为simple方式 mEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // ssl通道访问 if (env != null && "ssl".equals(env.securityProtocol)) { // 设定访问协议为ssl mEnv.put(Context.SECURITY_PROTOCOL, env.securityProtocol); // 设置访问证书属性,若没有此证书将无法通过ssl访问AD System.setProperty("javax.net.ssl.trustStore", env.sslTrustStore); } // 读取可以登陆ldap的帐号、密码 mEnv.put(Context.SECURITY_PRINCIPAL, env.adminUID); mEnv.put(Context.SECURITY_CREDENTIALS, env.adminPWD); log.debug(Constants.INIT + "DirContext"); // 通过参数连接LDAP/AD DirContext ctx = new InitialDirContext(mEnv); log.debug("LdapConnectionFactory:" + Constants.INIT + "DirContext" + Constants.SUCCESS); return ctx; } catch (NamingException ex) { ex.printStackTrace(); log.error("LdapConnectionFactory:" + Constants.INIT + "DirContext" + Constants.FAIL); log.error(ex.getMessage()); return null; } } /** * 关闭LDAP连接 * @param dirContext DirContext 已连接的LDAP的Context实例 */ public static void closeDirContext(DirContext dirContext) { try { if (dirContext != null) dirContext.close(); } catch (Exception ex) { ex.printStackTrace(); log.error("not close DirContext"); } } /** * 获取 LDAP 服务器连接的方法 * @param env 连接LDAP的连接信息 * @return DirContext - LDAP server的连接 */ public static DirContext getDirContext(Env env) { try { // 初始化Properties对象 Properties mEnv = new Properties(); // 使用LDAP/AD的认证方式 mEnv.put(Context.AUTHORITATIVE, "true"); // 设定LDAP/AD的连接工厂 mEnv.put(Context.INITIAL_CONTEXT_FACTORY, env.factory); // 设定LDAP/AD的url地址 mEnv.put(Context.PROVIDER_URL, env.url); // 设定连接TimeOut if (!StringUtils.isEmpty(env.timeOut)) { mEnv.put("com.sun.jndi.ldap.connect.timeout", env.timeOut); } // 设定安全模式为simple方式 mEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // ssl通道访问 if (env != null && "ssl".equals(env.securityProtocol)) { // 设定访问协议为ssl mEnv.put(Context.SECURITY_PROTOCOL, env.securityProtocol); // 设置访问证书属性,若没有此证书将无法通过ssl访问AD System.setProperty("javax.net.ssl.trustStore", env.sslTrustStore); } // 读取可以登陆ldap的帐号、密码 mEnv.put(Context.SECURITY_PRINCIPAL, env.adminUID); mEnv.put(Context.SECURITY_CREDENTIALS, env.adminPWD); log.debug(Constants.INIT + "DirContext"); // 通过参数连接LDAP/AD DirContext ctx = new InitialDirContext(mEnv); log.debug("LdapConnectionFactory:" + Constants.INIT + "DirContext" + Constants.SUCCESS); return ctx; } catch (NamingException ex) { ex.printStackTrace(); log.error("LdapConnectionFactory:" + Constants.INIT + "DirContext" + Constants.FAIL); log.error(ex.getMessage()); return null; } } }
|