- 浏览: 343006 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yin_bp:
不建议使用session复制机制,推荐bboss会话共享框架, ...
JBOSS7 集群和Session复制配置笔记 -
heipacker:
建议:java(多线程)实现高性能数据同步==>java ...
java(多线程)实现高性能数据同步 -
yang_min:
582399232 写道你的脚本貌似不能用呀?service ...
JBOSS7学习笔记 -
yang_min:
582399232 写道感觉这个脚本不好#shutdown=' ...
JBOSS7学习笔记 -
yang_min:
582399232 写道博主能问几个问题吗?1.按照你的步骤执 ...
JBOSS7 集群和Session复制配置笔记
如何使用封装JNDI操作LDAP服务器的工具类
下面是一个例子
测试类的功能,向windows Active Directory 增加一个域用户 lwf2_count,并激活该帐户
/** * 在当前连接的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; } }
相关推荐
本篇内容将深入探讨如何封装JNDI操作,以便更方便地与LDAP服务器进行交互。 首先,我们要理解封装的目标:简化 LDAP 操作,使得用户只需熟悉 List 和 Map 数据结构,而无需直接处理复杂的 JNDI API。为此,我们创建...
【封装JNDI操作LDAP】 在Java开发中,直接使用JNDI API操作LDAP可能会涉及很多底层细节,包括连接设置、安全配置等,这增加了代码的复杂性和出错的可能性。因此,为了简化这一过程,通常会创建一个工具类来封装这些...
在IT行业中,LDAP(Lightweight Directory Access Protocol)是一种用于访问和管理分布式目录服务的标准协议,常用于企业身份验证...在实际项目中,为了提高代码的可维护性和安全性,通常会封装成专门的服务或工具类。
1. **连接LDAP服务器**:使用`InitialDirContext`类建立与LDAP服务器的连接。首先,创建一个环境属性对象,配置服务器地址、端口、用户名和密码,然后通过`new InitialDirContext(environment)`初始化上下文。 2. *...
为了简化这些操作,你可以创建一个名为`LdapUtil`的工具类,封装连接、查询、添加、修改和删除的方法。这样可以使代码更易于理解和维护。 总结,Java LDAP操作涉及连接LDAP服务器、执行查询、添加、修改和删除条目...
在Java中,我们通常使用JNDI(Java Naming and Directory Interface)来与LDAP服务器交互。JNDI是一个API,它为多种命名和目录服务提供了统一的接口,包括LDAP。在本项目中,可能包含了一个或多个Java类,这些类封装...
- "ldapUtil"可能是这个压缩包中包含的Java工具类,它封装了对LDAP的各种操作,便于开发人员调用。 - 这个工具类可能包含连接LDAP服务器的方法,执行查询、增加、删除和修改操作的函数,以及异常处理逻辑。 学习...
Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的API,它允许程序查找和操作各种命名和目录服务,如 Lightweight Directory Access Protocol (LDAP)、Java Database Connectivity ...
4. **事务管理**:Spring LDAP 支持LDAP操作的事务管理,使得在分布式环境中处理数据一致性变得更加容易。 5. **异常处理**:它封装了JNDI(Java Naming and Directory Interface)异常,提供更友好的错误处理机制。...
4. **异常处理**:`providerutil`也包含了对JNDI操作中可能出现的异常进行封装和处理的类,使得异常处理更加规范和一致。 三、为何成为Maven稀缺资源 尽管`com.sun.jndi.providerutil.jar`是Java标准库的一部分,...
在实际项目中,这些通常会被封装到配置类或工具类中,以提高代码的可重用性和安全性。 在压缩包文件"LdapCRUDTest"中,可能包含了实现上述功能的测试代码。这些代码会展示如何在Java中使用JNDI进行具体的LDAP操作,...
它封装了JNDI(Java Naming and Directory Interface)API,使得开发者能够以更简洁的方式进行目录操作。 2. **ContextSource**:用于配置与 LDAP 服务器的连接。它可以设置URL、基础DN(Distinguished Name)、...
更重要的是,反射操作往往破坏了封装性,可能导致安全风险,因此在使用反射时需要特别小心,遵循最小权限原则。 最后,耦合性是衡量软件模块之间相互依赖程度的一个度量。低耦合意味着模块之间的关系简单,易于理解...
4. **JNDI与LDAP**: - JNDI服务:JNDI的基本概念、查找与绑定资源。 - LDAP目录服务:LDAP的特点、与JNDI的关系。 5. **RMI与EJB**: - RMI远程方法调用:RMI的工作原理、服务端与客户端的通信过程。 - EJB...
1. **Java基础**:Java是该项目的基础语言,学习者需要掌握Java面向对象编程的基本概念,包括类、对象、封装、继承、多态等。此外,对异常处理、输入输出流、集合框架(如ArrayList、HashMap)的理解也是必要的。 2...
### Java/J2EE核心概念与关键领域 ... - **并发工具类**:熟悉ConcurrentHashMap等并发容器的使用方法。 通过以上知识点的学习,读者可以全面掌握Java/J2EE的核心概念和技术细节,为即将到来的技术面试做好充分准备。
总的来说,`JDirectory`是Java开发者处理LDAP目录服务的强大工具,它通过简化JNDI的使用,使得开发人员能更专注于应用逻辑,提高了开发效率和代码质量。了解并掌握`JDirectory`,对于从事相关领域开发的人员来说,...
5. JNDI/LDAP目录集成:本书还会介绍如何利用Java命名和目录接口(JNDI)以及轻量级目录访问协议(LDAP)进行企业级服务的发现和集成。 6. 国际化:随着现代软件越来越注重全球市场,本节将说明如何利用Java的国际...
这部分内容涵盖了变量、数据类型、运算符、控制结构、类与对象、封装、继承、多态等基本概念。 #### Swing Swing是Java中用于构建图形用户界面(GUI)的一套组件库。了解Swing可以帮助开发者创建美观且功能丰富的...