ldap教程

前言:如果你是因为个人兴趣/爱好,翻到了这篇博客的话,那么恭喜你,要一个人走完一整套流程

一. 理论知识(必读)

链接:https://pan.baidu.com/s/1dS9ZxN6Zd4FI-XPb0Ri45w 
提取码:8oxb

二. 在linux机器上,安装 openldap

备注:这个需要自己百度

三. 安装 ldapbrowser

链接:https://pan.baidu.com/s/1FXSOo4Jv9Aezbws-0kUtkw 
提取码:h0b5

四. ldapbrowser 基本操作

1.双击 ldapbrowser 客户端工具

LDAP java 开源 ldap教程_java


2.新建一个ldap连接

LDAP java 开源 ldap教程_apache_02


3.连接名称任意

LDAP java 开源 ldap教程_LDAP java 开源_03

4.注意3那个地方

Anonymous bind : 匿名访问
append base DN :给 User Dn 选项,追加Base DN

LDAP java 开源 ldap教程_LDAP java 开源_04

五. 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