分享
 
 
 

封装JNDI操作LDAP服务器的工具类(4)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

目标:使用者只需要会使用List,Map 数据结构,将对LDAP的操作进行封装

类:主要有三个类

1 Env类 包含LDAP的连接信息

2 LdapConnectionFactory类 ldap连接工厂,提供初始化及获取ldap连接的方法

3 LdapOperUtils ldap的处理工具类,提供了各种操作ldap的方法。

接 封装JNDI操作LDAP服务器的工具类(3) LdapOperUtils类的其余方法

/**

* 在当前连接的DirContext 修改指定Context下的一个 或 多个属性

* @param context 连接的DirContext

* @param cn 指定Context下的名字

* @param attMap 包含List key为属性名称,当属性为多值时

* value 为包含多值的List,为单值时,为包含单值的String类型

* @throws BaseException

* @throws NamingException

*/

public static void modifyAttributes(DirContext context, String cn,

Map attMap) throws

BaseException, NamingException {

// 参数为空

if (context == null) {

String[] args = {

"context"};

// 打印错误日志

StringBuffer msglog = new StringBuffer(

"empty invoke parameter context NULL ");

log.error(msglog.toString());

throw new BaseException("error.common.parameter.empty", args);

}

// 参数为空

if (attMap == null) {

String[] args = {

"attMap"};

// 打印错误日志

StringBuffer msglog = new StringBuffer(

"empty invoke parameter attMap NULL ");

log.error(msglog.toString());

throw new BaseException("error.common.parameter.empty", args);

}

// 参数为空

if (StringUtils.isEmpty(cn)) {

String[] args = {

"cn"};

// 打印错误日志

StringBuffer msglog = new StringBuffer(

"empty invoke parameter cn NULL ");

log.error(msglog.toString());

throw new BaseException("error.common.parameter.empty", args);

}

// 为空,退出

if (attMap.isEmpty()) {

return;

}

// 取所有的属性key

Set keySet = attMap.keySet();

Iterator keyIterator = keySet.iterator();

Attributes attrs = new BasicAttributes();

// 迭代所有的属性key

while (keyIterator.hasNext()) {

// 取下一个属笥

String key = (String) keyIterator.next();

Attribute att = null;

Object valueObj = attMap.get(key);

if (valueObj instanceof List) {

// 为List ,为多值属性

att = new BasicAttribute(key);

List valueList = (List) valueObj;

// 加入多值属性

for (int i = 0; i < valueList.size(); i++) {

att.add(valueList.get(i));

}

} else if (valueObj instanceof String) {

att = new BasicAttribute(key, valueObj);

}

// 加入

attrs.put(att);

}

context.modifyAttributes(cn, DirContext.REPLACE_ATTRIBUTE, attrs);

// context.close();

}

//

/**

* 获取连接的DirContext中指定Context下的指定属性

* @param context 连接的DirContext

* @param cn

指定Context的名称

* @param attNameList 要取的属性的名称List

* @return Map包含List ,key 为属性的名称,当属性值为多值时,Value为List类型,

* 否则,value 为String 类型

* @throws NamingException

*/

public static Map getAttributes(DirContext context, String cn,

List attNameList) throws NamingException {

Map attsMap = new HashMap();

Attributes results = null;

List attValList = null;

String attrId = null;

if (attNameList == null) {

results = context.getAttributes(cn);

} else {

if (!attNameList.isEmpty()) {

// results = context.getAttributes(cn);

String[] stTemp = new String[attNameList.size()];

/////////////////////////////////////////// 以下方法性能太低 ////////////////////////////////

//

for (int i = 0; i < attNameList.size(); i++) {

//

stTemp[i] = (String) attNameList.get(i);

//

}

//

results = context.getAttributes(cn,

//

stTemp);

///////////////////////////////////////////////////////////////////////////////////////////

// 比较高性能的List 转为 数组的方法

results = context.getAttributes(cn,

(String[]) (attNameList.toArray(stTemp)));

}

}

for (int i = 0; i < attNameList.size(); i++) {

Attribute attr = results.get((String) attNameList.get(i));

attrId = (String) attNameList.get(i);

if (attr != null) {

if (attr.size() 0) {

NamingEnumeration vals = attr.getAll();

if (vals == null) {

continue;

}

Object obj1 = vals.nextElement();

if (obj1 == null) {

continue;

}

// 迭代这个属性的所有属性值

while (vals.hasMoreElements()) {

if (attValList == null) {

attValList = new ArrayList();

attValList.add(obj1);

}

attValList.add(vals.nextElement());

}

// 当属性为单值域时,存为字符串

// 当属性为多值域时,存为包含多值域的List

if (attValList != null) {

attsMap.put(attrId, attValList);

// 清空

attValList = null;

} else {

attsMap.put(attrId, obj1);

}

}

}

}

// context.close();

return attsMap;

}

/**

* 在当前连接的DirContext 获取指定Context下的指定属性名称的所有属性值(一个或多个值)

* @param context 连接的DirContext

* @param cn

指定Context的cn名

* @param attName 属性名称

* @return 返回包括属性值的List 注意,当属性只有一个值时,返回的List长度为1,当属性

* 是多值属性时,返回List长度为属性值的数目

* @throws NamingException

*/

public static List getAttributeValues(DirContext context, String cn,

String attName) throws

NamingException {

List attValList = new ArrayList();

List attNameList = new ArrayList();

attNameList.add(attName);

Map attMap = null;

attMap = getAttributes(context, cn, attNameList);

if (attMap != null) {

Object attValObj = attMap.get(attName);

if (attValObj instanceof String) {

attValList.add((String) attValObj);

} else if (attValObj instanceof List) {

attValList = ((List) attValObj);

}

}

// context.close();

return attValList;

}

/**

* 获取角色的相关信息

* @param context DirContext

* @param cn String

* @param attName String

* @return String

* @throws NamingException

*/

public static String getRoleAttributeValues(DirContext context, String cn,

String attName) throws

NamingException {

String result = "";

List attNameList = new ArrayList();

attNameList.add(attName);

Map attMap = null;

attMap = getAttributes(context, cn, attNameList);

if (attMap != null) {

Object attValObj = attMap.get(attName);

result = (String)attValObj;

}

return result;

}

/**

* 根据条件查找指定CN的Context下的一层所有属性

* @param context 连接了的DirContext

* @param cn 要查询的BaseCN名称

* @param filter 要查询的过滤字符串

* @return 符合查询结果的List

* @throws NamingException

*/

public static List searchContextOne(DirContext context, String cn,

String filter) throws

NamingException {

List resultList = new ArrayList();

Map resultRowMap = null;

List attValList = null;

String attValStr = null;

// 实例化一个搜索器

SearchControls constraints = new SearchControls();

// 设置搜索器的搜索范围

constraints.setSearchScope(SearchControls.ONELEVEL_SCOPE);

// 在基目录中搜索条件为Env.MY_FILTER的所有属性 注意:这里返回是的所有的条目集合

NamingEnumeration results

= context.search(cn, filter, constraints);

// 打印条目的识别名(DN)及其所有的属性名,值

while (results != null && results.hasMore()) {

// 取一个条目

SearchResult si = (SearchResult) results.next();

// 获取条目的所有属性集合

Attributes attrs = si.getAttributes();

if (attrs != null) {

String attrId = null;

// 一行数据

resultRowMap = new HashMap();

// 打印所有属性

for (NamingEnumeration ae = attrs.getAll();

ae.hasMoreElements(); ) {

// 获取一个属性

Attribute attr = (Attribute) ae.next();

attrId = attr.getID();

Enumeration vals = attr.getAll();

if (vals == null) {

continue;

}

Object obj1 = vals.nextElement();

if (obj1 == null) {

continue;

}

// 迭代这个属性的所有属性值

while (vals.hasMoreElements()) {

if (attValList == null) {

attValList = new ArrayList();

attValList.add(obj1);

}

attValList.add(vals.nextElement());

}

// 当属性为单值域时,存为字符串

// 当属性为多值域时,存为包含多值域的List

if (attValList != null) {

resultRowMap.put(attrId, attValList);

// 清空

attValList = null;

} else {

resultRowMap.put(attrId, obj1);

}

}

}

resultList.add(resultRowMap);

}

return resultList;

}

/**

* 根所条件查找指定CN的Context下的子树下的所有属性

* @param context 连接了的DirContext

* @param cn 要查询的BaseCN名称

* @param filter 要查询的过滤字符串

* @return 符合查询结果的List

* @throws NamingException

*/

public static List searchContextSub(DirContext context, String cn,

String filter) throws

NamingException {

List resultList = new ArrayList();

Map resultRowMap = null;

List attValList = null;

// 实例化一个搜索器

SearchControls constraints = new SearchControls();

// 设置搜索器的搜索范围

constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

// 在基目录中搜索条件为Env.MY_FILTER的所有属性 注意:这里返回是的所有的条目集合

NamingEnumeration results

= context.search(cn, filter, constraints);

// 打印条目的识别名(DN)及其所有的属性名,值

while (results != null && results.hasMore()) {

// 取一个条目

SearchResult si = (SearchResult) results.next();

// 获取条目的所有属性集合

Attributes attrs = si.getAttributes();

if (attrs != null) {

String attrId = null;

// 一行数据

resultRowMap = new HashMap();

// 打印所有属性值

for (NamingEnumeration ae = attrs.getAll();

ae.hasMoreElements(); ) {

// 获取一个属性

Attribute attr = (Attribute) ae.next();

attrId = attr.getID();

Enumeration vals = attr.getAll();

if (vals == null) {

continue;

}

Object obj1 = vals.nextElement();

if (obj1 == null) {

continue;

}

// 迭代这个属性的所有属性值

while (vals.hasMoreElements()) {

if (attValList == null) {

attValList = new ArrayList();

attValList.add(obj1);

}

attValList.add(vals.nextElement());

}

// 当属性为单值域时,存为字符串

// 当属性为多值域时,存为包含多值域的List

if (attValList != null) {

resultRowMap.put(attrId, attValList);

// 清空

attValList = null;

} else {

resultRowMap.put(attrId, obj1);

}

}

}

resultList.add(resultRowMap);

}

return resultList;

}

/**

* 查找指定CN的Context下的子树下的指定属性

* @param context DirContext

* @param cn String

* @param filter String

* @param returnedAtts String[] 属性名字数组

* @return List

* @throws NamingException

*/

public static List searchContextSub(DirContext context, String cn,

String filter, String[] returnedAtts) throws

NamingException {

List resultList = new ArrayList();

String attrId = null;

List attValList = null;

Map resultRowMap = null;

// 实例化一个搜索器

SearchControls constraints = new SearchControls();

// 设置搜索器的搜索范围

constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

// String[] returnedAtts = {"uniquemember"};

constraints.setReturningAttributes(returnedAtts);

// 条目

NamingEnumeration results

= context.search(cn, filter, constraints);

// 迭代所有的条目

while (results != null && results.hasMore()) {

// 取一个条目

SearchResult si = (SearchResult) results.next();

resultRowMap = new HashMap();

// 获取条目的指定返回的属性

Attributes attrs = si.getAttributes();

if (attrs != null) {

// 迭代所有属性值

for (NamingEnumeration ae = attrs.getAll();

ae.hasMoreElements(); ) {

// 获取一个属性

Attribute attr = (Attribute) ae.next();

attrId = attr.getID();

Enumeration vals = attr.getAll();

if (vals == null) {

continue;

}

// 迭代这个属性的所有属性值

while (vals.hasMoreElements()) {

if (attValList == null) {

attValList = new ArrayList();

}

attValList.add(vals.nextElement());

}

// 当属性为单值域时,存为字符串

// 当属性为多值域时,存为包含多值域的List

if (attValList != null) {

resultRowMap.put(attrId, attValList);

// 清空

attValList = null;

}

}

}

resultList.add(resultRowMap);

}

return resultList;

}

/**

* 查找指定CN的Context下的一层指定属性

* @param context DirContext

* @param cn String

* @param filter String

* @param returnedAtts String[] 属性名字数组

* @return List

* @throws NamingException

*/

public static List searchContextOne(DirContext context, String cn,

String filter, String[] returnedAtts) throws

NamingException {

List resultList = new ArrayList();

String attrId = null;

List attValList = null;

Map resultRowMap = null;

// 实例化一个搜索器

SearchControls constraints = new SearchControls();

// 设置搜索器的搜索范围

constraints.setSearchScope(SearchControls.ONELEVEL_SCOPE);

// String[] returnedAtts = {"uniquemember"};

constraints.setReturningAttributes(returnedAtts);

// 条目

NamingEnumeration results

= context.search(cn, filter, constraints);

// 迭代所有的条目

while (results != null && results.hasMore()) {

// 取一个条目

SearchResult si = (SearchResult) results.next();

resultRowMap = new HashMap();

// 获取条目的指定返回的属性

Attributes attrs = si.getAttributes();

if (attrs != null) {

// 迭代所有属性值

for (NamingEnumeration ae = attrs.getAll();

ae.hasMoreElements(); ) {

// 获取一个属性

Attribute attr = (Attribute) ae.next();

attrId = attr.getID();

Enumeration vals = attr.getAll();

if (vals == null) {

continue;

}

Object obj1 = vals.nextElement();

if (obj1 == null) {

continue;

}

// 迭代这个属性的所有属性值

while (vals.hasMoreElements()) {

if (attValList == null) {

attValList = new ArrayList();

attValList.add(obj1);

}

attValList.add(vals.nextElement());

}

// 当属性为单值域时,存为字符串

// 当属性为多值域时,存为包含多值域的List

if (attValList != null) {

resultRowMap.put(attrId, attValList);

// 清空

attValList = null;

} else {

resultRowMap.put(attrId, obj1);

}

}

}

resultList.add(resultRowMap);

}

return resultList;

}

/**

* 在当前的连接DirContext 删除 指定Context 下的 一个属性里面包含的子属性

* @param context 连接后的DirContext

* @param cn 指定Context的名称

* @param attList 包含要删除的属性的名称

* @throws BaseException

* @throws NamingException

*/

public static void deleteInAttributes(DirContext ctx, String userDN,

List attList,String flag) throws NamingException {

if (attList == null || attList.size() == 0) {

return;

} else {

int size = attList.size();

ModificationItem[] mods = new ModificationItem[size];

for (int i = 0; i < size; i++) {

Attribute att = null;

mods[i] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,

new BasicAttribute(

flag, (String) attList.get(i)));

}

ctx.modifyAttributes(userDN, mods);

}

}

/**

* 创建一个连接,通过捕捉Exception来确定该用户是否存在于目标ldap中

* @param configDto ConfigDto

* @param uid String

* @param password char[]

* @return boolean

* @throws NamingException

*/

public static boolean authenticate(ConfigDto configDto, String uid, char[] password) throws

NamingException {

Hashtable mEnvironment = new Hashtable();

DirContext mContext = null;

//创建连接

mEnvironment.put(Context.INITIAL_CONTEXT_FACTORY,

configDto.getEnvfactory());

mEnvironment.put(Context.PROVIDER_URL, configDto.getEnvurl());

mEnvironment.put(Context.SECURITY_AUTHENTICATION, "simple");

mEnvironment.put(Context.SECURITY_PRINCIPAL,

Constants.LDAP_PEOPLE_ATTRIBUTE_UID + "=" + uid + "," +

configDto.getEnvPeopleLoc());

mEnvironment.put(Context.SECURITY_CREDENTIALS, password);

try {

mContext = new InitialDirContext(mEnvironment);

log.debug("user:"+uid+" login!");

return true;

} catch (AuthenticationException ex) {

log.error("user:"+uid+" don't login because of wrong user name or password!");

return false;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有