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;
}
}
}
分享到:
相关推荐
封装JNDI的LDAP服务器所要使用的类的详细介绍。 封装JNDI操作LDAP服务器的工具类.doc
主要介绍了封装JNDI操作LDAP服务器的工具类,使用者只需要会使用List,Map 数据结构,大家参考使用吧
Windows_7_下搭建LDAP服务器并使用JNDI Windows_7_下搭建LDAP服务器并使用JNDI Windows_7_下搭建LDAP服务器并使用JNDI
基于Java JNDI 操纵LDAP的基础实现,包括LDAP连接相关生命周期,认证的两种策略demo,条目的操作,schema的基础操作包括(attributeDefinition\objectDefinition\)但未包含相关syntaxDefinition的操纵. 没有资源分的朋友...
import com.sun.jndi.ldap.ctl.VirtualListViewControl;
JNDI 操作 LDAP的几个例子源码 包括连接、添加、删除、修改、搜寻
NULL 博文链接:https://zzqrj.iteye.com/blog/1279219
maven稀缺jar资源
除了已知的JNDI攻击方法(通过引用中的远程类加载)之外,此工具还利用的功能带来了新的攻击媒介。 支持的有效载荷 经典的JNDI攻击,通过远程类加载导致RCE,可达到jdk8u191 通过org.apache.naming.factory.Bea
LDAPWindows 7 下搭建LDAP服务器并使用JNDI
提供了使用fsContext服务器的unbind bind list lookup rename的相关例子,及ldap 连接的一个例子 jndi,就是命名服务(n:naming)和目录服务(d:directory). 命名服务:把对象映射到方便记忆的名字的机制.可以通过域名系统...
详细讲解了JNDI概念和目录服务的配置,以LDAP服务器为平台,全面讲解JNDI操作LDAP.详细这本书是很多人都需要的,在大型项目中是经常使用的.
一款用作JNDI注入利用的工具,大量参考/引用了Rogue JNDI项目的代码,支持直接插入植入内存shell ,并集成了常见的bypass 高版本JDK的方式,适用于与自动化工具配合使用。 使用说明 使用java -jar JNDIExploit.jar -...
AD ldap java集成
JNDI服务利用工具 RMI/LDAP,支持部分场景回显、内存shell,高版本JDK场景下利用等,fastjson rce命令执行,log4j rce命令执行 漏洞检测辅助工具
jndi对数据库操作 数据源对数据库操作 最简单的java
rmi-jndi-ldap-jrmp-jmx-jms rmi,jndi,ldap,jrmp,jmx,jms一些演示测试
027-JNDI之初探 LDAP.pdf