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

本文介绍了一种通过LDAP查询特定组织单元(OU)下用户的实现方案。作者最初尝试获取所有用户再进行过滤,但最终选择先获取OU的DN,然后以此为基础查询用户。文章提供了具体的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



最近有个需求是需要按照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<String, Map<String, String>> dnIDValueMap = testSearch("cn=manager,o=mine,c=com", "(ou=louyu)");
		// 根据该ou的dn,获取该ou下的所有用户。
		for (Iterator<Entry<String, Map<String, String>>> iterator = dnIDValueMap.entrySet().iterator(); iterator
				.hasNext();) {
			Entry<String, Map<String, String>> 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", "abc@163.com");
		attrs.put("description", "");
		attrs.put("userPassword", "Password".getBytes("UTF-8"));
		ctx.createSubcontext(userDN, attrs);
	}

	public static Map<String, Map<String, String>> 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<SearchResult> answer = ctx.search(searchName, filter.toString(), searchControls);
		// 输出查到的数据
		// 全称
		String fullName = "";
		// dn-- ID -- value
		Map<String, Map<String, String>> dnIdValueMap = new HashMap<String, Map<String, String>>();
		// ID --- Value
		Map<String, String> idValueMap = null;
		while (answer.hasMore()) {
			SearchResult result = answer.next();
			fullName = result.getNameInNamespace();
			System.out.println(result.getNameInNamespace());
			NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll();
			idValueMap = new HashMap<String, String>();
			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;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值