java修改ou名称_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", "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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值