Java实现根据ou名次查询该ou下的所有用户,或者按照名称模糊查询



最近有个需求是需要按照ou名称查询所有的用户,不要求层级嵌套,即a下有b,b下有c,输入a只需要查询a下面的就可以了。

第一次接触ldap这个东东,在网上搜了下资料,大部分的需求都是和我的不一样。

要么都是直接查询所有的用户,或者是直接查询所有的ou。

1、刚开始想,既然能获取到所有的用户,那就先把所有用户获取过来在根据用户所属的ou进行过滤吧,

虽然这样可以做到,但是,总感觉这不太好,有点偷懒的感觉。

2、回到家中,玩了会CF,佣兵模式,哈哈,玩的不是太好,瞎玩,纯属娱乐,不太在意结果,在乎的是过程,跑题了。

玩完CF,想了下,今天还有一个问题还没有解决。

一直苦恼的思考中。忽然灵感一闪,为什么不先根据ou查询它的一些属性,把它的dn获取到,

然后直接作为查询条件的base,这样不就可以做到根据ou查询该ou下的用户了。哈哈是吧。


源代码奉上,其实有些代码还是参考了之前的前辈们,忘记参考的是哪位的了,在这提前谢谢分享了。

package com.jay.test.ldap;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

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.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class TestLdap2 {

	public static void main(String[] args) throws Exception {
		// 根据ou获取相关属性信息
		Map> dnIDValueMap = testSearch("cn=manager,o=mine,c=com", "(ou=louyu)");
		// 根据该ou的dn,获取该ou下的所有用户。
		for (Iterator>> iterator = dnIDValueMap.entrySet().iterator(); iterator
				.hasNext();) {
			Entry> entry = iterator.next();
			testSearch(entry.getKey(), "(uid=*)");
		}
	}

	public static void testAdd() throws Exception {
		LdapContext ctx = connetLDAP();
		Attributes attrs = new BasicAttributes(true);
		Attribute objclass = new BasicAttribute("objectclass");
		// 添加ObjectClass
		String[] attrObjectClassPerson = { "inetOrgPerson", "organizationalUnit", "organizationalPerson", "person",
				"top" };
		Arrays.sort(attrObjectClassPerson);
		for (String ocp : attrObjectClassPerson) {
			objclass.add(ocp);
		}
		attrs.put(objclass);
		String uid = "*";
		String userDN = "uid=" + uid + "," + "o=mine,c=com";
		// 密码处理
		// attrs.put("uid", uid);
		attrs.put("cn", uid);
		attrs.put("sn", uid);
		attrs.put("displayName", "张三");
		attrs.put("mail", "[email protected]");
		attrs.put("description", "");
		attrs.put("userPassword", "Password".getBytes("UTF-8"));
		ctx.createSubcontext(userDN, attrs);
	}

	public static Map> testSearch(String searchName, String filter) throws Exception {
		LdapContext ctx = connetLDAP();
		// 设置过滤条件 如果是*的话表示全部的,支持模糊查询, *是相当于数据库中的%
		String uid = "*";// 获取所有以asd开头的所有用户
		// String filter = "(&(objectClass=posixAccount)(uid=jaychou))";
		// 限制要查询的字段内容
		String[] attrPersonArray = { "uid", "userPassword", "ou", "displayName", "cn", "sn", "mail", "description" };
		SearchControls searchControls = new SearchControls();
		searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
		// 设置将被返回的Attribute
		searchControls.setReturningAttributes(null);
		// 三个参数分别为:
		// 上下文;
		// 要搜索的属性,如果为空或 null,则返回目标上下文中的所有对象;
		// 控制搜索的搜索控件,如果为 null,则使用默认的搜索控件 "cn=manager,o=mine,c=com"
		NamingEnumeration answer = ctx.search(searchName, filter.toString(), searchControls);
		// 输出查到的数据
		// 全称
		String fullName = "";
		// dn-- ID -- value
		Map> dnIdValueMap = new HashMap>();
		// ID --- Value
		Map idValueMap = null;
		while (answer.hasMore()) {
			SearchResult result = answer.next();
			fullName = result.getNameInNamespace();
			System.out.println(result.getNameInNamespace());
			NamingEnumeration attrs = result.getAttributes().getAll();
			idValueMap = new HashMap();
			while (attrs.hasMore()) {
				Attribute attr = attrs.next();
				idValueMap.put(attr.getID(), attr.get() == null ? "" : attr.get().toString());
				System.out.println(attr.getID() + "=" + attr.get());
			}
			dnIdValueMap.put(fullName, idValueMap);
			System.out.println("============");
		}
		return dnIdValueMap;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static LdapContext connetLDAP() throws NamingException {
		// 连接Ldap需要的信息
		String ldapFactory = "com.sun.jndi.ldap.LdapCtxFactory";
		String ldapUrl = "ldap://192.168.48.129:389/";// url
		String ldapAccount = "cn=manager,o=mine,c=com"; // 用户名
		String ldapPwd = "secret";// 密码
		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY, ldapFactory);
		// LDAP server
		env.put(Context.PROVIDER_URL, ldapUrl);
		env.put(Context.SECURITY_AUTHENTICATION, "simple");
		env.put(Context.SECURITY_PRINCIPAL, ldapAccount);
		env.put(Context.SECURITY_CREDENTIALS, ldapPwd);
		env.put("java.naming.referral", "follow");
		LdapContext ctxTDS = new InitialLdapContext(env, null);
		return ctxTDS;
	}
}

你可能感兴趣的:(Ldap)