Ldap实现AD域认证
1、java Ldap基础类
package com.common; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Properties; 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.DirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext; import org.apache.log4j.LogManager;
import org.apache.log4j.Logger; public class LdapLoadUserAD {
private static final Logger logger = LogManager.getLogger(LdapLoadUserAD.class);
private LdapContext ctx = null;
private String adminName = "TEST\\Administrator";
private String adminpassword = "admin";
private String host = "10.24.7.252";
private String port = "389";
private String ldapURL = new String("ldap://" + host + ":" + port);
private String searchBase = "OU=组织单位1,DC=test,DC=com";
private String searchFilter = "(&(objectClass=group)(cn=" + "war3" + "))";
private String returnedAtts[] = { "url", "whenChanged", "employeeID",
"name", "userPrincipalName", "physicalDeliveryOfficeName",
"departmentNumber", "telephoneNumber", "homePhone", "mobile",
"department", "sAMAccountName", "whenChanged", "mail" }; /**
* 已管理员身份 初始ad域服务器 (后期改进配置文件)
*
* @return
* @throws UnsupportedEncodingException
*/
public boolean initial_Ldap() throws UnsupportedEncodingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, adminName);
env.put(Context.SECURITY_CREDENTIALS, adminpassword);
env.put(Context.PROVIDER_URL, ldapURL);
try {
logger.info("Start InitialLdapContext");
ctx = new InitialLdapContext(env, null);
logger.info("InitialLdapContext succeed");
} catch (NamingException e) {
logger.error("Problem initial_Ldap NamingException: " + e);
return false;
}
return true;
} public boolean initial_Ldap(String administratorName,
String administratorPwd, String url) throws UnsupportedEncodingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, administratorName);
env.put(Context.SECURITY_CREDENTIALS, administratorPwd);
env.put(Context.PROVIDER_URL, url);
try {
logger.info("Start InitialLdapContext");
ctx = new InitialLdapContext(env, null);
logger.info("InitialLdapContext succeed");
} catch (NamingException e) {
logger.error("Problem initial_Ldap NamingException: " + e);
return false;
} return true;
} public boolean initial_Ldap(String administratorName,
String administratorPwd, String url, String keystore,
String keyPassword) {
Hashtable env = new Hashtable();
System.setProperty("javax.net.ssl.trustStore", keystore);
System.setProperty("javax.net.ssl.trustStorePassword", keyPassword);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, administratorName);
env.put(Context.SECURITY_CREDENTIALS, administratorPwd);
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put(Context.PROVIDER_URL, url);
try {
logger.info("Start InitialLdapContext");
ctx = new InitialLdapContext(env, null);
logger.info("InitialLdapContext succeed");
} catch (NamingException e) {
logger.error("Problem initial_Ldap NamingException: " + e);
return false;
} return true;
} /**
* 关闭Close Ldap
*
* @return
*/
public boolean close_Ldap() {
logger.info("Close Ldap");
try {
ctx.close();
} catch (NamingException e) {
logger.error("Problem close_Ldap NamingException: " + e);
return false;
}
return true;
} /**
* 自定义返回ldap树节点内容
*
* @param username
* 如果不为空返回指定节点内容
* @return
*/
public Hashtable<String, List> search_distinguishedName(String username) {
if (!(username.equals(""))) {
String searchFilter = "(&(objectClass=user)(cn=" + username + "))";
this.setSearchFilter(searchFilter);
} Hashtable<String, List> ls = new Hashtable<String, List>();
try {
logger.info("Start search " + username+ "'s distinguishedName");
SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchCtls.setReturningAttributes(this.getReturnedAtts());
NamingEnumeration answer = ctx.search(this.getSearchBase(),
this.getSearchFilter(), searchCtls);
int totalResults = 0;// Specify the attributes to return
int rows = 0;
while (answer.hasMoreElements()) {// 遍历结果集
SearchResult sr = (SearchResult) answer.next();// 得到符合搜索条件的DN String dn = sr.getName(); String match = dn.split("CN=")[1].split(",")[0];// 返回格式一般是CN=test,OU=测试
logger.info("match=" + match); Attributes Attrs = sr.getAttributes();// 得到符合条件的属性集
if (Attrs != null) {
try {
for (NamingEnumeration ne = Attrs.getAll(); ne
.hasMore();) {
List nb = new ArrayList();
;
Attribute Attr = (Attribute) ne.next();// 得到下一个属性
String valueid = Attr.getID().toString();
logger.info(" AttributeID=属性名:" + valueid); // 读取属性值
for (NamingEnumeration e = Attr.getAll(); e
.hasMore(); totalResults++) { String value = e.next().toString();
logger.info(" AttributeValues=属性值:"+ value);
nb.add(value);
}
ls.put(valueid, nb);
logger.info(" ---------------"); }
} catch (NamingException e) {
logger.error("Throw Exception : " + e);
}
}// if }
} catch (NamingException e) {
logger.error("Problem search_distinguishedName NamingException: "
+ e); }
return ls;
} public boolean searchAD(String username, String pwd, String domain) { try {
Properties env = new Properties();
//String account = username + "@" + domain;
String ldapURL = "LDAP://" + this.host + ":" + this.port; env.put(Context.PROVIDER_URL, ldapURL);
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, pwd);
//获取配置
//env = this.getAdProperties(env);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
// 批量处理
env.put(Context.BATCHSIZE, "50");
// 连接超时设置
env.put("com.sun.jndi.ldap.connect.timeout","300000");
// LDAP连接池
env.put("com.sun.jndi.ldap.connect.pool", "true");
// LDAP连接池最大数
env.put("com.sun.jndi.ldap.connect.pool.maxsize", "30");
// LDAP连接池优先数
env.put("com.sun.jndi.ldap.connect.pool.prefsize", "10");
// LDAP连接池超时
env.put("com.sun.jndi.ldap.connect.pool.timeout", "3000");
// LDAP连接池初始化数
env.put("com.sun.jndi.ldap.connect.pool.initsize", "10");
// LDAP连接池的认证方式
env.put("com.sun.jndi.ldap.connect.pool.authentication", "simple"); DirContext dc = new InitialLdapContext(env, null);
logger.info("认证成功"); SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
String searchBase = "DC=test,DC=com";
String returnedAtts[] = {"memberOf","uSNCreated"};
searchCtls.setReturningAttributes(returnedAtts);
NamingEnumeration<SearchResult> answer = dc.search(searchBase, searchFilter,searchCtls);
while (answer.hasMoreElements()) {
SearchResult sr = (SearchResult) answer.next();
logger.info("<<<::[" + sr.getName()+",uSNCreated="+sr.getAttributes().get("uSNCreated")+"]::>>>>");
}
dc.close(); return true;
} catch (Exception e) {
logger.error("认证失败:"+e.getMessage());
return false;
} }
/**
* 验证AD域用户登录
*
* @param username
* 用户名
* @param pwd
* 密码
* @param domain
* 域名称
* @return
*/
public boolean login(String username, String pwd, String url,String domain) {
try {
//String account = username + "@" + domain;
//String ldapURL = "LDAP://" + this.host + ":" + this.port;
//username = "test\\"+username;
username = domain+"\\"+username;
Properties env = new Properties();
String ldapURL = "LDAP://" + url;
env.put(Context.PROVIDER_URL, ldapURL);
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, pwd);
logger.info("------------ LdapLoadUserAD ---- login 1------------------ ldapURL="+ldapURL+"---username="+username+"---pwd="+pwd);
//获取配置
env = this.getAdProperties(env);
//认证
DirContext dc = new InitialLdapContext(env, null);
logger.debug("AD域认证登录成功LDAP接口" + " - username:[" + username +"] pwd:["+ pwd +"]");
dc.close();
return true;
} catch (Exception e) {
logger.error("AD域认证登陆失败LDAP接口:【"+ e.getMessage() + "】 - username:[" + username +"] pwd:["+ pwd +"]");
return false;
} }
/**
* 读取配置文件 配置AD域
*/
public Properties getAdProperties (Properties env) throws IOException{
InputStream is =null;
Properties props = new Properties();
try{
String f0 = Common.getClassPath() + "ad.properties";
is = new FileInputStream(f0);
props.load(is);
}catch(Exception e){
e.printStackTrace();
}finally{
if(null != is){
is.close();
is = null;
}
}
env.put(Context.SECURITY_AUTHENTICATION, props.getProperty("context.security.authentication"));
env.put(Context.INITIAL_CONTEXT_FACTORY, props.getProperty("context.initial.context.factory"));
// 批量处理
env.put(Context.BATCHSIZE, props.getProperty("context.batchsize"));
// 连接超时设置
env.put("com.sun.jndi.ldap.connect.timeout", props.getProperty("ldap.connect.pool.timeout"));
// LDAP连接池
env.put("com.sun.jndi.ldap.connect.pool", props.getProperty("ldap.connect.pool"));
// LDAP连接池最大数
env.put("com.sun.jndi.ldap.connect.pool.maxsize", props.getProperty("ldap.connect.pool.maxsize"));
// LDAP连接池优先数
env.put("com.sun.jndi.ldap.connect.pool.prefsize", props.getProperty("ldap.connect.pool.prefsize"));
// LDAP连接池超时
env.put("com.sun.jndi.ldap.connect.pool.timeout", props.getProperty("ldap.connect.pool.timeout"));
// LDAP连接池初始化数
env.put("com.sun.jndi.ldap.connect.pool.initsize", props.getProperty("ldap.connect.pool.initsize"));
// LDAP连接池的认证方式
env.put("com.sun.jndi.ldap.connect.pool.authentication", props.getProperty("ldap.connect.pool.authentication"));
return env;
} /**
* 返回登录域用户
*
* @return
*/
public String getAdminName() {
return adminName;
} /**
* 返回搜索域节点
*
* @return
*/
public String getSearchBase() {
return searchBase;
} /**
* 设置 ad域 (ldapURL)中 搜索域节点
*
* @param searchBase
*/
public void setSearchBase(String searchBase) {
this.searchBase = searchBase;
} /**
* 返回搜索过滤器
*
* @return
*/
public String getSearchFilter() {
return searchFilter;
} /**
* 设置 LDAP搜索过滤器
*
* @param searchFilter
*/
public void setSearchFilter(String searchFilter) {
this.searchFilter = searchFilter;
} /**
* 返回 域节点、过滤器类和搜索控制器搜索LDAP得到结果
*
* @return
*/
public String[] getReturnedAtts() {
return returnedAtts;
} /**
* 设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果
*
* @param returnedAtts
*/
public void setReturnedAtts(String[] returnedAtts) {
this.returnedAtts = returnedAtts;
} /**
* 设置登录域用户
*
* @param adminName
*/
public void setAdminName(String adminName) {
this.adminName = adminName;
} public String getAdminpassword() {
return adminpassword;
} public void setAdminpassword(String adminpassword) {
this.adminpassword = adminpassword;
} public String getHost() {
return host;
} public void setHost(String host) {
this.host = host;
} public String getPort() {
return port;
} public void setPort(String port) {
this.port = port;
} public String getLdapURL() {
return ldapURL;
} public void setLdapURL(String ldapURL) {
this.ldapURL = ldapURL;
} }
2、java业务逻辑调用基层方法即可 这个是验证用户名 密码的调用
//连接AD域 验证登录用户名、密码是否正确
LdapLoadUserAD inst = new LdapLoadUserAD();
String url = this.userService.getParams("ad_ip")+":"+this.userService.getParams("ad_port");//AD域地址
String domain = this.userService.getParams("ad_domain");//AD域域名
succ = inst.login(username,password,url,domain);
3、写一个配置AD域库 相关参数配置的文件ad.properties 方便读取 修改
#AD域库 相关参数配置 #连接超时设置
ldap.connect.timeout=300000
#LDAP连接池
ldap.connect.pool=true
#LDAP连接池最大数
ldap.connect.pool.maxsize=30
#LDAP连接池优先数
ldap.connect.pool.prefsize=10
#LDAP连接池超时
ldap.connect.pool.timeout=3000
#LDAP连接池初始化数
ldap.connect.pool.initsize=10
#LDAP连接池的认证方式
ldap.connect.pool.authentication=simple
#批量处理
context.batchsize=50
#认证类型
context.security.authentication=simple
#初始上下文工厂
context.initial.context.factory=com.sun.jndi.ldap.LdapCtxFactory
4、代码部分大致是这个意思了,测试调试的时候,需要配置微软的AD域库,具体配置方案网上还是很多的。
Ldap实现AD域认证的更多相关文章
- Python实现AD域认证
Python 通过ldap进行ad域账号的校验. 首先需要安装python-ldap的模块 http://www.python-ldap.org/. 在这里用的是windows系统,当然比较容易,下载 ...
- Jenkins配置AD域认证
Jenkins配置AD域认证 #检测域控地址ping youad.com指向的IP #如果不是实际域控ip地址,则修改hosts vi /etc/hosts #192.168.100.100替换为实际 ...
- SonarQube 配置 LDAP(AD域)
安装插件 1.下载 LDAP Plugin 插件,地址:https://docs.sonarqube.org/display/SONARQUBE67/LDAP+Plugin2.将下载的插件,放到 SO ...
- JAVA 通过LDAP获取AD域用户及组织信息
因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的A ...
- JAVA使用Ldap操作AD域
项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员 ...
- Asp.net MVC 集成AD域认证
1.首先WebApi 应用下Web.config要配置域认证服务器节点,如下 <!--LDAP地址 用于项目AD系统账号密码验证--> <!--0:关闭域认证:1:开启域认证--&g ...
- 实验记录贴 —— 账号同步实验 RTX 和 LDAP(AD域)
目前,公司有多个系统,RTX,邮箱(MD),OA,NC. 这些系统之间,如果要实现单点登录的话,账户肯定需要同步,或者某一种映射机制. 如果所有数据都和中央账号数据库(LDAP,这里是AD域)看齐,那 ...
- Java使用LdAP获取AD域用户
随着我们的习大大上台后,国家在网络信息安全方面就有了非常明显的改变!所以如今好多做网络信息安全产品的公司和须要网络信息安全的公司都会提到用AD域server来验证,这里就简单的研究了一下! 先简单的讲 ...
- openvpn通过ldap或ad统一认证解决方案思路分享
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/986933 缘起:成 ...
随机推荐
- .NET开源工作流RoadFlow-流程运行-运行时监控
流程实例参与者都可以随时查看流程实例的运行情况,如果是待办任务,则在待办事项列表的后面点查看,如果是已完成任务则可以在已办事项列表的后面点查看: 打开之后默认为列表方式显示流程的处理过程,还可以点图形 ...
- Revit
log file Windows Vista or Windows 7:%LOCALAPPDATA%\Autodesk\Revit\Autodesk Revit 2016\Journals
- webstorm中使用git
webstorm中使用git将代码放入tfs两种方式: 直接在tfs上建立仓库,复制仓库地址,然后在本地打开webstorm,然后git克隆这个仓库 使用git命令将本地项目上传到tfs git re ...
- Razor模板引擎 (RazorEngine)
Razor模板引擎不仅在ASP.NET MVC中内置了Razor模板引擎,还有一个开源的RazorEngine, 这样以来我们可以在非ASP.NET MVC项目中使用Razor引擎,甚至在控制台,Wi ...
- python filter&sorted
filter filter()接收一个函数和一个序列和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素在一个list中, ...
- February 10 2017 Week 6 Friday
Example is always more efficacious than precept. 身教胜于言教. Always match your words with your actions. ...
- 优秀的看图工具推荐 —— XnViewMP
XnViewMP是一款非常棒的完全免费图片浏览器,支持100多种图片格式,XnViewMP还具有浏览器.幻灯片.屏幕捕捉.缩略图制作.批处理转换.十六进制浏览.拖放.通讯录.扫描输入等功能.XnVie ...
- Native广告月入万刀的全部细节!
一步一步跑Native原生广告: 第一步:跑native前期的准备工作 第二步:阅读大神的Native文档(100多页,英文,建议找一个支持在线翻译功能的app来阅读) 第三步:阅读我的几十条经验总结 ...
- SAP成都研究院2018年总共87篇技术文章合集
2018年很快就要结束了.Jerry在2017年年底准备开始写这个公众号时,给自己定的目标是:2018年至少保证每周发布一篇高质量的文章.如今2018年就快过去了,高质量与否需要大家来反馈,至少从量上 ...
- [译] 怎样(以及为什么要)保持你的 Git 提交记录的整洁
最近在掘金翻译了一篇文章,主要讲的是 Git 提交记录的维护,确实很有用,感兴趣的同学可以去看一下.链接如下: [译] 怎样(以及为什么要)保持你的 Git 提交记录的整洁 截图: