您的位置:首页 > 编程语言 > Java开发

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

2016-04-05 22:55 561 查看
最近有个需求是需要按照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");// 添加ObjectClassString[] 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);// 设置将被返回的AttributesearchControls.setReturningAttributes(null);// 三个参数分别为:// 上下文;// 要搜索的属性,如果为空或 null,则返回目标上下文中的所有对象;// 控制搜索的搜索控件,如果为 null,则使用默认的搜索控件 "cn=manager,o=mine,c=com"NamingEnumeration<SearchResult> answer = ctx.search(searchName, filter.toString(), searchControls);// 输出查到的数据// 全称String fullName = "";// dn-- ID -- valueMap<String, Map<String, String>> dnIdValueMap = new HashMap<String, Map<String, String>>();// ID --- ValueMap<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/";// urlString ldapAccount = "cn=manager,o=mine,c=com"; // 用户名String ldapPwd = "secret";// 密码Hashtable env = new Hashtable();env.put(Context.INITIAL_CONTEXT_FACTORY, ldapFactory);// LDAP serverenv.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;}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: