最近有个需求是需要按照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", "abc@163.com");
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 extends Attribute> 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;
}
}