ldap教程
前言:如果你是因为个人兴趣/爱好,翻到了这篇博客的话,那么恭喜你,要一个人走完一整套流程
一. 理论知识(必读)
链接:https://pan.baidu.com/s/1dS9ZxN6Zd4FI-XPb0Ri45w
提取码:8oxb
二. 在linux机器上,安装 openldap
备注:这个需要自己百度
三. 安装 ldapbrowser
链接:https://pan.baidu.com/s/1FXSOo4Jv9Aezbws-0kUtkw
提取码:h0b5
四. ldapbrowser 基本操作
1.双击 ldapbrowser 客户端工具
2.新建一个ldap连接
3.连接名称任意
4.注意3那个地方
Anonymous bind : 匿名访问
append base DN :给 User Dn 选项,追加Base DN
五. Java基础代码部分
log4j.properties:
log4j-1.2.4.jar (这是你需要的jar包)
# debug => info => waring => error => fail
log4j.rootCategory=INFO, CONSOLE ,LOGFILE
# log4j.logger
log4j.logger.com.svw=DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %d{yyyy-MM-dd HH:mm:ss} %p %m %n
#log4j.appender.CONSOLE.layout.ConversionPattern=%m %n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=logInfo.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%C %d{yyyy-MM-dd HH:mm:ss} %m %L %n
#log4j.appender.LOGFILE.layout.ConversionPattern=%m %n
ldap.properties:
java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
java.naming.provider.url=ldap://你自己的IP或者域名:389/
java.naming.security.authentication=simple
java.naming.security.principal=你的连接DN,比如:cn=admin,dc=csvw,dc=com
java.naming.security.credentials=你的密码
java.naming.referral=follow
LdapUtil.java
实际上,LDAP也能像数据库一样,做CRUD功能,下面的代码只是没有写出那么多
推荐看下面的参考文档
package com.svw.util;
import java.io.IOException;
import java.io.InputStream;
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.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import org.apache.log4j.Logger;
public class LdapUtil<E> {
// 记录日志
private Logger logger = Logger.getLogger(LdapUtil.class);
// 得到初始目录环境的一个引用
private static InitialLdapContext dirContext = null;
// 创建Hashtable以存储JNDI将用于连接目录服务的环境变量
private static Hashtable<String, Object> env = null;
/**
* 初始化LDAP 目录服务上下文.
* 通过一个Hashtable或者Properties对象为LDAP的Context设置参数,
* 而后初始化InitialDirContext, 即可绑定LDAP服务。
* 这相当于JDBC中获取数据库的Connection对象。
*/
static {
// 加载配置文件
Properties properties = new Properties();
try {
String configFile = "ldap.properties";// 配置文件路径
// 加载配置文件到输入流中
InputStream is = LdapUtil.class.getClassLoader().getResourceAsStream(configFile);
// 从输入流中读取属性列表
properties.load(is);
} catch (IOException e1) {
e1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
env = new Hashtable<String, Object>(8);
// 设置连接Ldap的实现工厂
env.put(Context.INITIAL_CONTEXT_FACTORY, properties.get(Context.INITIAL_CONTEXT_FACTORY));
// 给环境提供认证方法,有SIMPLE、SSL/TLS和SASL
env.put(Context.SECURITY_AUTHENTICATION, properties.get(Context.SECURITY_AUTHENTICATION));
// 指定LDAP服务器IP地址为本机及端口号
env.put(Context.PROVIDER_URL, properties.get(Context.PROVIDER_URL));
// 指定进入的目录识别名DN
env.put(Context.SECURITY_PRINCIPAL, properties.get(Context.SECURITY_PRINCIPAL));
// 进入的目录密码
env.put(Context.SECURITY_CREDENTIALS, properties.get(Context.SECURITY_CREDENTIALS));
env.put(Context.REFERRAL, properties.get(Context.REFERRAL));
}
/**
*
* <p>Title: connect</p>
* <p>Description: 开启AD连接</p>
*/
public void connect() {
try {
dirContext = new InitialLdapContext(env, null);
Logger.getLogger(LdapUtil.class)
.info("Connect AD{" + this.env.get(Context.PROVIDER_URL) + "} successfully!");
} catch (NamingException e) {
Logger.getLogger(LdapUtil.class).error("Connect AD{" + this.env.get(Context.PROVIDER_URL) + "} failed!");
Logger.getLogger(LdapUtil.class).error(e);
}
}
/**
*
* <p>Title: close</p>
* <p>Description: 关闭AD连接,释放资源</p>
*/
public void close() {
if (dirContext != null) {
try {
dirContext.close();
Logger.getLogger(LdapUtil.class)
.info("Close AD{" + this.env.get(Context.PROVIDER_URL) + "} successfully!");
} catch (NamingException e) {
Logger.getLogger(LdapUtil.class).error(e);
}
}
}
/**
*
* <p>Title: findDNAttrubites</p>
* <p>Description: 查询条目属性</p>
* @param dn
* @return
*/
public List<String> findDNAttrubites(String dn) {
List<String> list = new ArrayList<String>();
try {
Attributes attrs = dirContext.getAttributes(dn);
if (attrs != null) {
NamingEnumeration<String> nEnum = attrs.getIDs();
for (; nEnum.hasMore();) {
String attrID = nEnum.next();
Attribute attr = (Attribute) attrs.get(attrID);
list.add(attrID);
}
} else {
Logger.getLogger(LdapUtil.class).error("No found svwapp_xxx attributes is true.");
return null;
}
} catch (NamingException e) {
e.printStackTrace();
}
return list;
}
/**
*
* <p>Title: searchDn</p>
* <p>Description: 查询用户DN</p>
* @param filter 设置过滤条件
* @param attrPersonArray 限制要查询的字段内容
* @param ldapGroupDN 上下文
* @return
* @throws InterruptedException
*/
public List<String> searchDn(String filter, String[] attrPersonArray, String ldapGroupDN)
throws InterruptedException {
List<String> list = new ArrayList<String>();
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// 设置将被返回的Attribute
searchControls.setReturningAttributes(attrPersonArray);
// 三个参数分别为:
// 上下文;
// 要搜索的属性,如果为空或 null,则返回目标上下文中的所有对象;
// 控制搜索的搜索控件,如果为 null,则使用默认的搜索控件
NamingEnumeration<SearchResult> answer;
try {
answer = dirContext.search(ldapGroupDN, filter.toString(), searchControls);
while (answer.hasMore()) {// 遍历查到的数据
SearchResult result = answer.next();
list.add(result.getNameInNamespace());
Logger.getLogger(LdapUtil.class).info(result.getNameInNamespace());
}
} catch (NamingException e) {
logger.error(e);
return null;
}
return list;
}
}
六.参考文档
按顺序去看一遍
链接:https://pan.baidu.com/s/1TW9b7IGTvv3ROLoTFpr4cA
提取码:vb79
链接:https://pan.baidu.com/s/1wfPnAm3kL7Ar9zCZqNc82A
提取码:px7n