JAVA_基本LDAP操作
java jndi ldap 用法
java jndi ldap 用法哎哟喂,各位看官,今儿咱来摆摆龙门阵,说说这四川话、贵州话、陕西话和北京话咋个结合起来,再给大家讲讲这Java JNDI LDAP的用法。
咱们先从轻松的话题开始,再慢慢引入正题,好让各位看官有个缓冲。
咱们四川人说话,那就是直来直去,不拐弯抹角。
就说这天气吧,热得跟蒸笼似的,让人喘不过气来。
贵州的朋友呢,说话细腻,就像他们那里的山水一样,清亮亮的。
陕西的老乡,说话豪爽,嗓门大,一听就知道是西北汉子。
北京的朋友,说话那就讲究个儿化音,听着特舒服。
好了,咱们言归正传,来说说这Java JNDI LDAP的用法。
首先啊,得明白这几个词儿是啥意思。
Java,那就是个编程语言,像咱们做菜用的调料一样,得有它才能编出好程序。
JNDI呢,就是Java Naming and Directory Interface,简单来说,就是个找东西的工具,能帮你找到需要的资源。
LDAP,轻量级目录访问协议,就像咱们查电话簿一样,能帮你找到想要的信息。
那么,这几个东西咋个结合起来用呢?简单说,就是通过Java编程语言,利用JNDI这个工具,去访问LDAP服务器上的资源。
就像咱们通过菜谱,用调料做菜一样,得有调料,还得会用,才能做出好吃的菜来。
具体来说,你得先配置好LDAP服务器,把需要的信息都放上去。
然后,在Java程序里,通过JNDI的API,去连接LDAP服务器,查找你需要的信息。
这个过程,就像咱们在电话簿里查找电话号码一样,得知道怎么查,才能找到想要的信息。
当然啦,这个过程也不是一帆风顺的,可能会遇到各种问题。
比如,连接不上服务器、找不到需要的信息等等。
这时候,就得看你的编程功底和经验了。
不过,只要掌握了基本的原理和方法,再加上不断的实践,相信你一定能够驾驭这个强大的工具,编出高效、稳定的程序来。
好了,今儿咱就聊到这儿吧。
希望这篇文章能让大家对这几个概念有个初步的了解,也能对Java JNDI LDAP的用法有个大致的把握。
ldap常用命令 -回复
ldap常用命令-回复LDAP(Lightweight Directory Access Protocol)是一种用于访问和维护分布式目录服务的协议。
它旨在提高对目录服务的访问效率,并使其易于使用和管理。
LDAP常用命令是进行LDAP操作的关键工具,本文将详细介绍LDAP常用命令及其用途。
1. ldapsearchldapsearch命令用于搜索和检索LDAP目录中的条目。
它可以使用不同的选项和过滤器来指定搜索条件。
例如,要搜索名称为"John Smith"的所有用户,可以使用以下命令:ldapsearch -x -b "dc=example,dc=com" "(cn=John Smith)"-x:使用简单认证模式进行连接;-b:指定要进行搜索的基准DN;"(cn=John Smith)":指定搜索的过滤条件,这里搜索名称为"John Smith"的条目。
ldapsearch命令将返回与搜索条件匹配的所有条目的详细信息,包括DN、属性和属性值。
2. ldapaddldapadd命令用于向LDAP目录中添加新的条目。
它需要一个LDIF (LDAP Data Interchange Format)文件作为输入,该文件描述了要添加的条目的结构和属性。
以下是一个示例:ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f entry.ldif-D:指定进行操作的用户DN;-W:提示输入密码;-f:指定要添加的条目的LDIF文件。
ldapadd命令将读取LDIF文件,并将其中描述的条目添加到LDAP目录中。
3. ldapmodifyldapmodify命令用于修改LDAP目录中的现有条目。
它也需要一个LDIF文件作为输入,并根据其中的描述对目录进行修改。
ldaptemplate 构造
标题:ldaptemplate 构造一、概述在Java开发中,使用LDAP(轻量级目录访问协议)进行用户和组织架构管理是很常见的需求。
为了方便对LDAP进行操作,Spring提供了ldaptemplate来简化LDAP的访问和操作。
本文将介绍如何使用ldaptemplate进行LDAP的构造。
二、依赖引入在使用ldaptemplate之前,需要在项目中引入相应的依赖。
可以通过Maven或Gradle来进行依赖管理,以下是Maven引入ldaptemplate的依赖方式:```xml<dependency><groupId>org.springframework.ldap</groupId><artifactId>spring-ldap-core</artifactId><version>2.3.2.RELEASE</version></dependency>```三、配置LDAP连接在使用ldaptemplate之前,首先需要配置LDAP的连接信息,包括LDAP服务器的URL、用户名、密码等。
通常可以通过Spring的配置文件(如application.properties或application.yml)来进行配置,以下是一个配置LDAP连接的示例:```propertiesldap.url=ldap://localhost:389ldap.base=dc=example,dcername=admin,dc=example,dcldap.password=admin```四、构造ldaptemplate构造ldaptemplate通常需要注入LdapContextSource和LdapTemplate两个Bean,其中LdapContextSource用于配置LDAP连接信息,而LdapTemplate用于执行LDAP操作。
ldapadmin使用手册
ldapadmin使用手册一、简介ldapadmin是一款功能强大的LDAP(轻量目录访问协议)管理工具,它提供了用户友好的界面,用于管理和维护LDAP服务器上的目录。
本手册将向您介绍如何使用ldapadmin进行LDAP目录的管理。
二、安装和配置2.1 下载和安装ldapadmin1.打开ldapadmin的官方网站。
2.在下载页面选择适用于您操作系统的版本,然后单击下载按钮。
3.下载完成后,按照安装向导进行安装。
2.2 配置ldap服务器连接在首次启动ldapadmin之后,您需要配置与LDAP服务器的连接。
按照以下步骤进行配置: 1. 打开ldapadmin并选择“文件”>“设置”。
2. 在设置窗口中,选择“连接”选项卡。
3. 点击“添加”按钮,输入连接名称和LDAP服务器的主机名和端口号。
4. 输入管理员用户名和密码,并验证连接是否成功。
5. 单击“确定”保存配置。
三、目录管理3.1 创建目录项您可以使用ldapadmin创建新的目录项。
按照以下步骤进行操作: 1. 在ldapadmin的主界面上选择您要在其中创建目录项的上级目录。
2. 单击工具栏上的“新建目录项”按钮。
3. 在弹出的对话框中,输入新目录项的属性和值。
4. 单击“确定”按钮创建目录项。
3.2 编辑目录项您可以通过ldapadmin编辑目录项的属性和值。
按照以下步骤进行操作: 1. 在ldapadmin的主界面上选择要编辑的目录项。
2. 单击工具栏上的“编辑目录项”按钮。
3. 在弹出的对话框中,可以修改目录项的属性和值。
4. 单击“确定”按钮保存更改。
3.3 删除目录项如果您需要删除一个目录项,可以按照以下步骤进行操作: 1. 在ldapadmin的主界面上选择要删除的目录项。
2. 单击工具栏上的“删除目录项”按钮。
3. 单击“确定”按钮确认删除操作。
四、搜索和过滤4.1 执行搜索操作ldapadmin提供了强大的搜索功能,您可以根据特定的条件搜索目录项。
ldap简易教程
ldap简易教程OpenLdap 简易教程教程主旨是简单介绍ldap概念,Openldap 安装,配置,维护,以及java项目对ldap 的操作等。
BY:FrogchouchouE-Mail:****************目录总述: (2)1、获取资源及安装 (3)2、配置openldap (4)3、导入一些数据 (7)4、验证 (11)5、管理ldap (13)6、java 操作ldap (14)总结: (17)总述:LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。
目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。
目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。
目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。
而目录服务的更新则一般都非常简单。
这种目录可以存储包括个人信息、web链结、jpeg图像等各种信息。
为了访问存储在目录中的信息,就需要使用运行在TCP/IP 之上的访问协议—LDAP。
LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。
条目相当于关系数据库中表的记录;条目是具有区别名DN(Distinguished Name)的属性(Attribute),DN是用来引用条目的,DN相当于关系数据库表中的关键字(Primary Key)。
属性由类型(Type)和一个或多个值(Values)组成,相当于关系数据库中的字段(Field)由字段名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。
LDAP 中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。
LDAP把数据存放在文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。
Java 操作LDAP代码
2009-08-12LDAP代码操作DemoLDAP操作代码样例初始化LDAP 目录服务上下文该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ldap://localhost:8389),认证方式采用simple类型,即用户名/密码方式。
private static void initialContext() throws NamingException{if(singleton == null){singleton = new LDAPConnection();/** 在实际编码中,这些环境变量应尽可能通过配置文件读取*///LDAP服务地址singleton.sLDAP_URL = "ldap://localhost:8389";//管理员账号singleton.sMANAGER_DN = "uid=linly,ou=People,dc=jsoso,dc=net"; //管理员密码singleton.sMANAGER_PASSWORD = "coffee";//认证类型singleton.sAUTH_TYPE = "simple";//JNDI Context工厂类singleton.sCONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";singleton.envProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, singleton.sCONTEXT_FACTORY);singleton.envProps.setProperty(Context.PROVIDER_URL,singleton.sLDAP_URL);singleton.envProps.setProperty(Context.SECURITY_AUTHENTICATION, singleton.sAUTH_TYPE);singleton.envProps.setProperty(Context.SECURITY_PRINCIPAL, singleton.sMANAGER_DN);singleton.envProps.setProperty(Context.SECURITY_CREDENTIALS, singleton.sMANAGER_PASSWORD);/** 绑定ldap服务器*/singleton.dirCtx = new InitialDirContext(singleton.envProps);}}通过一个Hashtable或者Properties对象为LDAP的Context设置参数,而后初始化InitialDirContext,即可绑定LDAP服务。
LDAP使用手册
LDAP使用手册1.LDAP介绍LDAP就是一种目录,或称为目录服务。
LDAP的英文全称是Lightweight Directory Access Protocol,即轻量级目录访问协议,是一个标准化的目录访问协议,它的核心规范在RFC中都有定义[16][17]。
LDAP基于一种叫做X.500的标准,X.500是由ITU-T和ISO定义的目录访问协议,专门提供一种关于组织成员的电子目录使得世界各地因特网访问权限内的任何人都可以访问该目录。
在X.500目录结构中,需要通过目录访问协议DAP,客户机通过DAP查询并接收来自服务器目录服务中的一台或多台服务器上的响应,从而实现对服务器和客户机之间的通信控制。
然而DAP需要大量的系统资源和支持机制来处理复杂的协议。
LDAP仅采纳了原始X.500目录存取协议DAP的功能子集而减少了所需的系统资源消耗,而且可以根据需要进行定制。
在实际的应用中,LDAP比X.500更为简单更为实用,所以LDAP技术发展得非常迅速。
目前在企业范围内实现的支持LDAP的系统可以让运行在几乎所有计算机平台上的所有应用程序从LDAP目录中获取信息,LDAP目录中也可以存储各种类型的数据,如:电子邮件地址、人力资源数据、公共密匙、联系人列表,系统配置信息、策略信息等。
此外,与X.500不同,LDAP支持TCP,这对当今Internet来讲是必须的。
目前己有包括微软、IBM在内的几十家大型软件公司支持LDAP技术。
1997年发布了第三个版本LDAPV3[17],它的出现是LDAP协议发展的一个重要转折,它使LDAP协议不仅仅作为X.500的简化版,同时提供了LDAP协议许多自有的特性,使LDAP协议功能更为完备,安全性更高,生命力更为强大。
1.1组成LDAP的四个模型组成LDAP的四个模型是:信息模型,命名模型,功能模型,安全模型。
1.1.1信息模型LDAP信息模型定义能够在目录中存储的数据类型和基本的信息单位。
LDAP使用手册
L D A P使用手册(共25页) -本页仅作为预览文档封面,使用时请删除本页-LDAP使用手册一、LDAP介绍LDAP是轻量级目录访问协议的简称(Lightweight Directory Access Protocol).用于访问目录服务。
它是目录访问协议的移植,但是简化了实现方法。
二、目录服务与关系数据库之间的区别a)目录查询操作比关系数据库有更高的效率,但是更新效率比关系数据库低b)目录不支持关系数据库那样的复杂查询,比如两个表的连接。
c)目录不支持多操作的事物完整性,没有方式确认一些操作是全部成功还是全部失败d)目录能够能好和更灵活的支持子查询和匹配查询e)目录协议更适合应用于广域网,比如因特网或者大型公司的网络f)目录的管理,配置,和调试比关系型数据库更简单g)在使用关系数据库之前,必须首先定义表结构(模式)才可以进行操作。
而目录中所使用的模式是由LDAP定义好的一系列类组成的。
对于目录中的每条记录中必须属于其中的一个类或者多个类。
这些类定义了该记录中可以存储的信息。
h)目录以对象的形式存储数据。
信息被组织成树型结构。
i)目录服务支持分布式存储结构,容易实现数据的扩展,能满足大容量存储的要求。
三、LDAP的优点1:可以存储在其它条件下很难存储的管理信息2:数据安全可靠,访问控制粒度细腻。
3:LDAP是一个标准的,开放的协议,具有平台无关性。
4:数据分布广,规模可灵活扩充。
5:LDAP目录服务器可以使任何一种开放源代码或商用的LDAP目录服务器。
四、LDAP模型LDAP模型是从协议中继承过来的。
是LDAP的一个组成部分,用于指导客户如何使用目录服务LDAP 定义了四个模型,包括信息模型,命名模型,功能模型,安全模型。
信息模型(LDAP information model)LDAP信息模型用于描述LDAP中信息的表达方式。
LDAP信息模型包含三部分Entries Attributes ValuesEntry:Directry中最基本的信息单元,Entry中所包含的信息描述了现实世界中的一个真实的对象,在目录系统中它可以理解为,目录树中的一个节点。
Java LDAP介绍
Java:LDAP(1) 什么是LDAPLDAP, Lightweight Directory Access Protocol, 轻量级目录访问协议,是X.500协议的简化版本。
LDAP的规范为RFC 2251(ftp:///in-notes/rfc2251.txt),"The Lightweight Directory Access Protocol (v3)"。
Microfost的Active Directory,Lotus的Domino Directory、IBM的WebSphere都是LDAP的实现,LDAP的开源实现是OpenLDAP。
LDAP由以下几部分组成:LDAP协议,一个标准的、可扩展的Internet目录访问协议;使用目录的四种模型:信息模型,信息如何存储;命名模型,如何安排和引用目录数据;功能模型,如何操作数据;安全模型,如何进行访问控制;LDIF,LDAP Data Interchange Format,标准的交换目录数据的文本格式;LDAP服务软件;和LDAP服务软件捆绑在一起的命令行工具和基于LDAP的应用程序;LDAP编程API,用于开发LDAP客户应用程序。
(2) LDAP协议客户端发起一个请求消息,请求LDAP服务器的某条目录信息,该请求包含唯一的消息ID,如下图。
服务器收到该请求后,返回客户需要的信息,然后在一条独立的消息中返回结果代码。
客户端也可以在一条消息中请求多条目录信息,服务器依次返回这些目录条目,并在最后一条消息中返回结果代码,如下图。
客户端还可以同时发出多条请求消息,服务器响应这些请求,响应中包含请求消息ID,如下图。
$False$LDAP协议的操作分为三大类:查询操作:search, compare更新操作:add, delete, modify, modify DN(rename)认证和访问控制:bind, unbind, abandon下图是一个典型的LDAP协议操作过程。
Java6.0API包在LDAP调用的概述
Java6.0API包在LDAP调用的概述从JDK5.0开始,对LDAP协议的数据访问操作就被集成在javax的扩展API包中,并随同JDK一并发布,这一章节,我们主要介绍API包中的类信息。
javax.naming.directory 包的结构常用API解析javax.naming.directory.InitialDirContext,初始化目录服务上下文类该类是LDAP数据内容的操作工具类,通过该类可以执行绑定LDAP服务器、新增LDAP条目、获取条目实例、修改条目属性、删除条目和根据条件搜索条目等操作。
常用方法说明如下:初始化LDAP 目录服务上下文(相当于使用JDBC打开一个数据库链接)∙InitialDirContext(Hashtable<?,?> environment)绑定/创建LDAP条目对象(相当于新增一个LDAP条目数据bind(Name ∙name, Object obj, Attributes attrs)∙bind(String name, Object obj, Attributes attrs)∙createSubcontext(Name name, Attributes attrs)∙createSubcontext(String name, Attributes attrs)获取条目实例(属性集)∙getAttributes(Name name)∙getAttributes(Name name, String[] attrIds)∙getAttributes(String name)∙getAttributes(String name, String[] attrIds)修改条目属性∙modifyAttributes(Name name, int mod_op, Attributes attrs) ∙modifyAttributes(Name name, ModificationItem[] mods)∙modifyAttributes(String name, int mod_op, Attributes attrs) ∙modifyAttributes(String name, ModificationItem[] mods)υ删除条目∙destroySubcontext(Name name)∙destroySubcontext(String name)根据属性集搜索条目∙search(Name name, Attributes matchingAttributes)∙search(Name name, Attributes matchingAttributes, String[] attributesToReturn)∙search(String name, Attributes matchingAttributes)∙search(String name, Attributes matchingAttributes, String[] attributesToReturn)υ根据过滤器搜索条目∙search(Name name, String filterExpr, Object[] filterArgs, SearchControls cons)∙search(Name name, String filter, SearchControls cons)∙search(String name, String filterExpr, Object[] filterArgs, SearchControls cons)∙search(String name, String filter, SearchControls cons)javax.naming.directory.BasicAttribute,LDAP基本属性对象该类用来表示LDAP条目中的单个属性对象。
java ssl ldap范例
java ssl ldap范例在Java中,你可以使用SSL(Secure Sockets Layer)来建立与LDAP(Lightweight Directory Access Protocol)服务器的安全连接。
以下是一个简单的Java示例,演示如何使用SSL连接到LDAP服务器:import javax.naming.Context;import javax.naming.NamingEnumeration;import javax.naming.NamingException;import javax.naming.directory.Attributes;import javax.naming.directory.DirContext;import javax.naming.directory.InitialDirContext;import javax.naming.directory.SearchControls;import javax.naming.directory.SearchResult;import java.util.Hashtable;public class LDAPSSLExample {public static void main(String[] args) {// LDAP服务器的连接参数String ldapUrl = "ldaps://your-ldap-server:636"; // 注意ldaps://用于SSL连接String username = "your-ldap-username";String password = "your-ldap-password";Hashtable<String, String> env = new Hashtable<>();env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.PROVIDER_URL, ldapUrl);env.put(Context.SECURITY_AUTHENTICATION, "simple");env.put(Context.SECURITY_PRINCIPAL, username);env.put(Context.SECURITY_CREDENTIALS, password);env.put(Context.SECURITY_PROTOCOL, "ssl"); // 使用SSLtry {// 建立SSL连接DirContext context = new InitialDirContext(env);// 定义LDAP查询条件String searchBase = "dc=example,dc=com";String searchFilter = "(objectClass=person)";SearchControls searchControls = new SearchControls();searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);// 执行LDAP查询NamingEnumeration<SearchResult> results = context.search(searchBase, searchFilter, searchControls);while (results.hasMore()) {SearchResult result = results.next();Attributes attributes = result.getAttributes();// 处理查询结果System.out.println("Name: " + attributes.get("cn").get());System.out.println("Email: " + attributes.get("mail").get());}// 关闭LDAP连接context.close();} catch (NamingException e) {e.printStackTrace();}}}在这个示例中,我们使用Java的InitialDirContext来建立与LDAP服务器的SSL连接。
LDAP操作的两种方案
LDAP操作的两种⽅案最近由于项⽬需要研究了⼀下LDAP相关知识,感觉对没接触过的⼈来说还是有点坑的,所以记录下来给⼤家分享。
由于是第⼀次接触,就在⽹上搜了⼀些相关的⽂章,照着⽰例代码测试,却怎么也连不上LDAP服务器,最后折腾的能连上服务器了,⼜不能检索⽤户。
折腾过程中遇到的主要错误就是:There is no such object on the server.The username or password is incorrect.The server could not be contacted.在经历了N⼩时的煎熬之后,终于找到了第⼀种解决⽅案,其实就是参考⽹上的⽰例代码,但是⽰例代码的AuthenticationTypes是None,测试连接的时候总是不能正常连接,LDAP地址只能写host,后⾯不能跟DN,否则就连不上服务器,⽽且这种⽅法连接上服务器也不能检索⽤户。
后来改为AuthenticationTypes.FastBind之后才能正常⼯作了。
1//----------------------------------------------------------------------------------------------2// DirectoryEntry ⽅案,需要引⽤ System.DirectoryServices3//----------------------------------------------------------------------------------------------4var ldapPath = "LDAP://" + host + "/" + baseDN; // LDAP必须要⼤写,好像是.NET的特⾊5 DirectoryEntry de = new DirectoryEntry(ldapPath, adminName, adminPass, AuthenticationTypes.FastBind);6 DirectorySearcher searcher = new DirectorySearcher(de);7 searcher.Filter = "(uid=" + testUser + ")";8 searcher.SearchScope = SearchScope.Subtree;9 searcher.PropertiesToLoad.Add("uid");10 searcher.PropertiesToLoad.Add("cn");1112var result = searcher.FindOne();1314// 输出⼏个查询的属性值15foreach (string n in result.Properties.PropertyNames)16 {17 Console.WriteLine("{0}: {1}", n, result.Properties[n][0].ToString());18 }1920try21 {22int pos = stIndexOf('/');23string uid = result.Path.Remove(0, pos + 1);2425// ⼆次连接,使⽤需要认证的⽤户密码尝试连接26 DirectoryEntry deUser = new DirectoryEntry(ldapPath, uid, testPass, AuthenticationTypes.FastBind);27var connected = deUser.NativeObject;2829 Console.WriteLine("### 认证成功!");30 }31catch32 {33 Console.WriteLine("认证失败~~~");34 }另外⼀种⽅案是我同事找到的,和我上⾯⼀种⽅案⼏乎在同⼀时间找到,⽐较坑,是使⽤.NET官⽅类库中的LdapConnection,我⼀直认为LDAP这么常见的东西⼀定有官⽅的解决⽅案,奈何搜遍了国内外的中⽂、E⽂⽹站,“LDAP C#”、“LDAP .NET”关键字都搜了,就是没有任何⼈提到关于这个类的⽚⾔只字,真⽆语!难道这玩意就这么冷门吗?难道⼤家都在⽤DirectoryEntry吗?不可思议。
java对Ldap操作
java对Ldap操作{/** *//*** 定义使用springframework对ldap的访问操作对象借助LdapTemplate可以实现大部分对ldap的操作*/private LdapTemplate ldapTemplate;/** *//*** @param ldapTemplate* spring setter 注入*/public void setLdapTemplate(LdapTemplate ldapTemplate) ...{this.ldapTemplate = ldapTemplate;}/** *//*** 获得所有的用户名(ldap称cn),可根据第二个参数指定返回值是否重复** @param scope* 取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,* SUBTREE_SCOPE三个查询范围,分别代表当前对象查询、当前节点下对象查询、当前节点所有子目录查询** @param distinct* true,去掉结构中的重复值;false 允许结果中包含重复值* @return 查询范围下返回的cn列表*/public List<String> getAllPersonNames(int scope, boolean distinct) ...{// 存储查询结果的集合final ArrayList<String> allPersonCnList = new ArrayList<String>();// 使用ldapTemplate提供的接口查询,objectclass=person 表示对象为person的对象 ldapTemplate.search("", "(objectclass=person)",createSearchControls(scope), new AttributesMapper() ...{public Object mapFromAttributes(Attributes attrs)throws NamingException ...{// 获取cn的属性,用户名存在cn中Attribute attr = attrs.get("cn");// 若没有该属性返回nullif (attr == null) ...{return null;} else ...{ // 获取属性// 若包含多个cn属性,需要循环获取Enumeration ent = attr.getAll();while (ent.hasMoreElements()) ...{allPersonCnList.add(ent.nextElement().toString());}}return null;}});// true,去掉结果中的重复值if (distinct) ...{ArrayList<String> templist = new ArrayList<String>();for (String cn : allPersonCnList)if (!templist.contains(cn)) ...{templist.add(cn);}// 返回无重复值的结果return templist;}// 返回包含重复值的结果return allPersonCnList;}/** *//*** 查询指定范围下的所有用户信息** @param scope* 取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,* SUBTREE_SCOPE三个查询范围,分别代表当前对象查询、当前节点下对象查询、当前节点所有子目录查询** @return 查询范围下返回的所有用户信息列表*/public List getAllPersons(int scope) ...{// 使用ldapTemplate提供的接口查询,objectclass=person 表示对象为person的对象return ldapTemplate.search("", "(objectclass=person)",createSearchControls(scope), new LdapObjectAttributesMapper());}/** *//*** 根据Uid查询用户信息,*代表任意长度的任意字符** @param uid* 用户的uid* @param scope* 取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,* SUBTREE_SCOPE三个查询范围,分别代表当前对象查询、当前节点下对象查询、当前节点所有子目录查询** @return 用户信息*/public List getPersonByUid(String uid, int scope) ...{// 使用ldapTemplate提供的接口查询,objectclass=person 表示对象为person的对象// uid 和 objectclass 组成联合查询条件,两个同时满足的查询结果return ldapTemplate.search("", "(&(objectclass=person)(uid= " + uid+ "))", createSearchControls(scope),new LdapObjectAttributesMapper());}/** *//*** 查询包含当前Cn信息的所有用户,*代表任意长度的任意字符** @param cn* 用户的cn* @param scope* 取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,* SUBTREE_SCOPE三个查询范围,分别代表当前对象查询、当前节点下对象查询、当前节点所有子目录查询** @return 用户列表*/public List getPersonByCn(String cn, int scope) ...{// 使用ldapTemplate提供的接口查询,objectclass=person 表示对象为person的对象// cn 和 objectclass 组成联合查询条件,两个同时满足的查询结果return ldapTemplate.search("","(&(objectclass=person)(cn=" + cn + "))",createSearchControls(scope), new LdapObjectAttributesMapper());}/** *//*** @param scope* 取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,* SUBTREE_SCOPE三个查询范围,分别代表当前对象查询、当前节点下对象查询、当前节点所有子目录查询** @return 返回查询控制器对象*/private SearchControls createSearchControls(int scope) ...{// 查询控制类SearchControls设定查询范围SearchControls constraints = new SearchControls();constraints.setSearchScope(scope);return constraints;}/** *//*** 使用LdapPersonInfo类对象实现复合查询,属性中可使用通配符*,*代表任意长度的任意字符** @param ldapPersonInfo* 查询条件* @param scope* 取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,* SUBTREE_SCOPE三个查询范围,分别代表当前对象查询、当前节点下对象查询、当前节点所有子目录查询** @return 用户列表*/public List getPersonByPersonEnty(LdapPersonInfo ldapPersonInfo, int scope) ...{// strb存储、组装查询条件集合StringBuffer strb = new StringBuffer("(&(objectclass=person)");// uid 属性if (ldapPersonInfo.getUid() != null && ldapPersonInfo.getUid() != "& quot;) ...{strb.append("(uid=" + ldapPersonInfo.getUid() + ")");}// givenname 属性if (ldapPersonInfo.getFirstName() != null&& ldapPersonInfo.getFirstName() != "") ...{strb.append("(givenname=" + ldapPersonInfo.getFirstName() + &quo t;)");}// sn 属性if (ldapPersonInfo.getLastName() != null&& ldapPersonInfo.getLastName() != "") ...{strb.append("(sn=" + ldapPersonInfo.getLastName() + ")" );}// cn 属性if (ldapPersonInfo.getCn() != null && ldapPersonInfo.getCn().size() > 0) ...{for (int i = 0; i < ldapPersonInfo.getCn().size(); i++)strb.append("(cn=" + ldapPersonInfo.getCn().get(i) + ")&quo t;);}// telephonenumber 属性if (ldapPersonInfo.getTelephone() != null&& ldapPersonInfo.getTelephone() != "") ...{strb.append("(telephonenumber=" + ldapPersonInfo.getTelephone()+ ")");}// facsimiletelephonenumber 属性if (ldapPersonInfo.getFax() != null && ldapPersonInfo.getFax() != "& quot;) ...{strb.append("(facsimiletelephonenumber=" + ldapPersonInfo.getFax()+ ")");}// mail 属性if (ldapPersonInfo.getMail() != null && ldapPersonInfo.getMail() != " ") ...{strb.append("(mail=" + ldapPersonInfo.getMail() + ")");}String filter = strb.append(")").toString();return ldapTemplate.search("", filter, createSearchControls(scope),new LdapObjectAttributesMapper());}/** *//*** 根据dn查找用户,dn为base dn 的相对dn.(若basedn为:dc=koal,dc=com,user* dn为:uid=123,dc=koal,dc=com,则此处只需要提供 123 作为参数)** @param dn* 相对base dn的dn参数* @return 用户信息*/public LdapPersonInfo getLdapObjectByDn(String dn) ...{return (LdapPersonInfo) ldapTemplate.lookup(dn,new LdapObjectAttributesMapper());}/** *//*** 登陆验证** @param userDn* 用户的user dn* @param password* 用户登陆密码* @return 登陆成功返回true,不成功返回false*/private boolean loginCheack(String userDn, String password) ...{// 获取DirContext对象DirContext ctxs = ldapTemplate.getContextSource().getReadOnlyContext();try ...{// 组装登陆ldap需要的信息数据Hashtable<Object, Object> ht = new Hashtable<Object, Object>(); // 获取已有的登陆信息ht = (Hashtable<Object, Object>) ctxs.getEnvironment();// 设置用户ht.put(Context.SECURITY_PRINCIPAL, userDn);// 设置用户登陆密码ht.put(Context.SECURITY_CREDENTIALS, password);// 设置用户验证方式为simpleht.put(Context.SECURITY_AUTHENTICATION, "simple");// 出现异常时表示用当前登陆人登陆失败DirContext c = new InitialDirContext(ht);c.close();return true;} catch (Exception e) ...{// e.printStackTrace();System.out.println("login false");return false;} finally ...{try ...{ctxs.close();} catch (Exception ie) ...{}}}/** *//*** 验证用户登陆** @param uid* 用户uid* @param password* 用户密码** @return 是否登陆成功*/public boolean userLogin(String uid, String password) ...{// 获取用户id所在ldap中的user dnList dnlist = getUserDnByUid(uid);// 根据查询到的所有dn遍历,检查是否某一user dn与用户密码可以登陆ldap for (Object dn : dnlist) ...{if (loginCheack(dn.toString(), password) == true) ...{return true;}}return false;}/** *//*** 查询用户user dn** @param uid* 用户uid** @return 用户dn列表,当前目录节点下可能存在多个相同uid的多个user dn */public List<String> getUserDnByUid(String uid) ...{// 获取DirContext对象DirContext ctx = ldapTemplate.getContextSource().getReadOnlyContext(); // 存储用户dnArrayList<String> dn = new ArrayList<String>();try ...{SearchControls constraints = new SearchControls();constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);NamingEnumeration en = ctx.search("", "uid=" + uid, con straints);// 查询所有用户while (en != null && en.hasMoreElements()) ...{Object obj = en.nextElement();if (obj instanceof SearchResult) ...{SearchResult si = (SearchResult) obj;// 获取dn并添加到查询列表dn.add(si.getNameInNamespace());}}ctx.close();} catch (Exception e) ...{e.printStackTrace();try ...{ctx.close();} catch (Exception ee) ...{ee.printStackTrace();}}return dn;}/** *//*** ldap用户信息数据填充类将获取的属性信息封装为LdapObject对象**/private class LdapObjectAttributesMapper implements AttributesMapper ...{public Object mapFromAttributes(Attributes attrs)throws NamingException ...{LdapPersonInfo LdapObject = new LdapPersonInfo();try ...{// 获取并封装uid属性LdapObject.setUid((String) getAttribute(attrs, "uid"));// 获取并封装givenname属性LdapObject.setFirstName((String) getAttribute(attrs,"givenname"));// 获取并封装sn属性LdapObject.setLastName((String) getAttribute(attrs, "sn")); // 获取并封装cn属性LdapObject.setCn(getMoreSameAttributes(attrs, "cn"));// 获取并封装telephonenumber属性LdapObject.setTelephone((String) getAttribute(attrs,"telephonenumber"));// 获取并封装facsimiletelephonenumber属性LdapObject.setFax((String) getAttribute(attrs,"facsimiletelephonenumber"));// 获取并封装mail属性LdapObject.setMail((String) getAttribute(attrs, "mail"));} catch (NamingException n) ...{n.printStackTrace();}// 返回封装后的用户对象return LdapObject;}/** *//*** 从属性列表中获取指定的属性** @param attrs* 属性列表* @param attrName* 需要获取的属性* @return 返回获取的属性值* @throws NamingException*/private String getAttribute(Attributes attrs, String attrName)throws NamingException ...{Attribute attr = attrs.get(attrName);// 若没有指定的属性返回空字符串if (attr == null) ...{return "";} else ...{return (String) attr.get();}}/** *//*** 从属性列表中获取指定的属性的所有属性值** @param attrs* 属性列表* @param attrName* 需要获取的属性* @return 返回获取的属性值* @throws NamingException*/private List<String> getMoreSameAttributes(Attributes attrs, String attrName) throws NamingException ...{Attribute attr = attrs.get(attrName);List<String> elelist = new ArrayList<String>();// 若没有指定的属性返回nullif (attr == null) ...{return null;} else ...{// 获取当前属性的所有值,添加到返回列表中Enumeration ent = attr.getAll();while (ent.hasMoreElements())elelist.add(ent.nextElement().toString());return elelist;}}}private void dispPerson(LdapPersonInfo temp) ...{System.out.println("-----------------------------");System.out.println("User(uid: " + temp.getUid() + ") listing..." ;);System.out.println("First Name: " + temp.getFirstName());System.out.println("Last Name: " + temp.getLastName());System.out.println("Common Name: " + temp.getCn());System.out.println("User ID: " + temp.getUid());System.out.println("E-Mail: " + temp.getMail());System.out.println("Phone: " + temp.getTelephone());System.out.println("Fax: " + temp.getFax());System.out.println("List completed.");System.out.println("-----------------------------n");}public static void main(String[] str) ...{ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserDaoLdapImpl test = (UserDaoLdapImpl) context.getBean("userDao" );System.out.println(erLogin("lisi", "123"));}}查看文档来源:/sniperit8/article/details/2113525。
Java LDAP介绍
Java:LDAP(1) 什么是LDAPLDAP, Lightweight Directory Access Protocol, 轻量级目录访问协议,是X.500协议的简化版本。
LDAP的规范为RFC 2251(ftp:///in-notes/rfc2251.txt),"The Lightweight Directory Access Protocol (v3)"。
Microfost的Active Directory,Lotus的Domino Directory、IBM的WebSphere都是LDAP的实现,LDAP的开源实现是OpenLDAP。
LDAP由以下几部分组成:LDAP协议,一个标准的、可扩展的Internet目录访问协议;使用目录的四种模型:信息模型,信息如何存储;命名模型,如何安排和引用目录数据;功能模型,如何操作数据;安全模型,如何进行访问控制;LDIF,LDAP Data Interchange Format,标准的交换目录数据的文本格式;LDAP服务软件;和LDAP服务软件捆绑在一起的命令行工具和基于LDAP的应用程序;LDAP编程API,用于开发LDAP客户应用程序。
(2) LDAP协议客户端发起一个请求消息,请求LDAP服务器的某条目录信息,该请求包含唯一的消息ID,如下图。
服务器收到该请求后,返回客户需要的信息,然后在一条独立的消息中返回结果代码。
客户端也可以在一条消息中请求多条目录信息,服务器依次返回这些目录条目,并在最后一条消息中返回结果代码,如下图。
客户端还可以同时发出多条请求消息,服务器响应这些请求,响应中包含请求消息ID,如下图。
$False$LDAP协议的操作分为三大类:查询操作:search, compare更新操作:add, delete, modify, modify DN(rename)认证和访问控制:bind, unbind, abandon下图是一个典型的LDAP协议操作过程。
Java对LDAP的操作方法
Java对LDAP的操作方法Java对LDAP的操作方法最近因为项目需要,研究了下大名久仰的LDAP。
它以目录树结构存放数据信息,和数据库以表结构存放数据不同。
网络上关于LDAP 的介绍很多,不是本文的重点。
作为程序员,最关心的就是如何写程序去访问和操作LDAP数据,这也是本文所要讨论的,但是局限于java程序。
一.JNDI(JAVA 命名及目录接口)JNDI是JAVA为命名及目录服务访问制定的基础接口标准,用于访问包括DNS,NIS,LDAP,文件系统等任何以树目录形式存在目标对象,并且基本上可保持访问方式的一致(意味着代码共用)。
对于不同的目录类型,JNDI通过使用不同的目录驱动,以保证访问方式的一致。
以下连接可获得较详细的讲解和例程:。
经常使用的LDAP驱动有JDK自带的LDAP provider,还有IBM的PROVIDER,以及NOVEL的JNDI产品。
二.jldapJLDAP是由Novell开发的,原是针对Novel的NDS目录设计的JAVA访问工具。
NOVEL的NDS和网景(NETSCAPE)的目录是工具界最早的目录产品。
JLDAP并非JNDI的服务供应者,而是同一抽象层次下的访问工具集。
与JNDI-LDAP相比,JLDAP更接近于类关系数据库的访问方式。
NDS是遵守LDAP协议的并进行了扩展的类MAD产品。
而NOVEL也已把JLDAP捐献给了OPENLDAP开源项目,可以世界范围内自由使用。
与JNDI相比,JLDAP无须继承DirContext才能实现添加,也无需预先生成添加的类,可以象普通数据访问那样,生成连接,然后使用add方法添加。
这样,添加的灵活性要强于JNDI。
三.JdbcLDAP驱动网络上有2种形式的jdbc-Ldap驱动程序,提供以sql的语法访问ldap数据库。
1.OcterString的开源驱动提供下载。
但是由于2005年11月被OERACLE并购,网络上难以找到相关的资料,唯一可以参考的资料是其所带的JDBC-LDAP Getting Started.pdf文档。
java使用ldap修改ad域用户密码
1 注意:1. LDAP 无法获取window s Active Directory 用户密码2. 系统管理员可以修改其他用户的密码(不需要知道原来的旧密码),或者用户可以修改自己的密码(用户必须知道自己的密码)。
这些密码修改操作必须通过一个安全通道来执行,象SSL、TLS、Kerberos。
3. Windows 2000 域控制器不支持TLS协议。
但是Windows 2000 和Window s Server 2003 域控制器都支持SSL。
对基于SSL或TLS的会话,你的工作站(或指定的JRE)必须信任域控制器认证中心发布的CA证书。
相关资料可到网站在看具体步骤如下:环境要求:一台安装Active Directory 的服务器,域名为security.boco一台安装证书服务(需安装企业根证书)的服务器,此服务器加入security域中一台安装JAVA应用的服务器,此服务器不需要加入security域中安装步骤:1 安装Active Directory 域控制器2 安装证书服务3 以域用户登录到安装了证书服务的服务器中,导出域根证书和计算机证书第一步:进入MMC控制台,添加证书,选择本地计算机d1.jpgdc1.jpg进入MMC 控制台dm1.jpg添加证书管理单元,选择本地计算机个人- 第二步展开刚增加的证书节点,选择证书>证书,选择CA证书,导出证书◊个人◊第三步展开证书节点,选择证书,右击所有任务,申请新证书,证书类型选择计算机类型xz.jpgxz2.jpg4 将从证书中导出的两个证书文件,*.cer 使用java的keytool工具创建或导入证书库文件中导入CA证书D:\Borland\jdk142_05\bin>keytool -import -keystore security51.keystore -file 51A Droot.cer输入keystore密码: lwfmahOwner: CN=securityCA, DC=security, DC=boco发照者:CN=securityCA, DC=security, DC=boco序号:72880fb3005cd7a54efa9c224241008b有效期间:Thu Nov 10 20:48:49 CST 2005 至:Tue Nov 10 20:55:33 CST 2015认证指纹:MD5: 51:3F:C3:B1:C3:A6:EF:24:55:70:2A:25:0D:EB:57:59SHA1:B3:EE:CC:92:E3:D4:87:48:D4:1D:F3:53:5B:0E:99:E1:B7:0F:27:20信任这个认证?[否]: y认证已添加至keystore中导入申请的计算机证书D:\Borland\jdk142_05\bin>keytool -import -keystore security51.keystore -alias comkey -file 51AD.cer输入keystore密码: lwfmah认证已添加至keystore中5 编写如下代码修改Active Direcotry 域用户密码public static void main(String[] args) throws UnknownHostException,IOException {// .Socket sock = new .Socket("10.110.180.50",636);// boolean b = sock.isConnected();Hashtable env = new Hashtable();String adminName = "cn=administrator,cn=users,DC=security,DC=boco";String adminpassword = "123456789";String userName = "CN=iam_lwf_count,OU=网管中心,DC=security,DC=boco";// old password Ab123456String newPassword = "liaowufeng";String keystore = "D:/Borland/jdk142_05/bin/security51.keystore";// String keystore = "E:/project/iam/testADlhj.keystore";System.setProperty(".ssl.trustStore", keystore);System.setProperty(".ssl.trustStorePassword", "lwfmah");env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.SECURITY_AUTHENTICATION, "simple");env.put(Context.SECURITY_PRINCIPAL, adminName);env.put(Context.SECURITY_CREDENTIALS, adminpassword);env.put(Context.SECURITY_PROTOCOL, "ssl");String ldapURL = "ldaps://10.110.180.50:636";env.put(Context.PROV IDER_URL, ldapURL);try {LdapContext ctx = new InitialLdapContext(env, null);ModificationItem[] mods = new ModificationItem[1];String newQuotedPassword = "\"" + newPassword + "\"";byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("unicodePwd",newUnicodePassword));ctx.modifyAttributes(userName, mods);System.out.println("Reset Password for: " + userName);ctx.close();System.out.println("Problem encoding password222: ");} catch (Exception e) {e.printStackTrace();System.out.println("Problem encoding password222: " + e);}}。
java请求ldap协议的函数
java请求ldap协议的函数
“java请求ldap协议的函数”这句话的意思是,在Java编程语言中,存在一些函数或方法可以用来发送LDAP(轻量级目录访问协议)请求。
LDAP是一种应用层协议,用于查询和操作目录服务服务器中的信息。
在Java中,可以使用JNDI(Java Naming and Directory Interface)或者LDAP的Java绑定API来发送LDAP请求。
这些API提供了一些函数或方法,例如连接LDAP服务器、执行查询、获取结果等。
具体的函数或方法名称可能会因使用的API或库而有所不同。
例如,使用JNDI时,可以使用DirContext类中的方法来执行LDAP操作。
使用LDAP的Java绑定API时,可以使用LDAPConnection类中的方法来连接LDAP服务器并执行查询。
总结来说,“java请求ldap协议的函数”是指Java编程语言中用于发送LDAP请求的函数或方法。
这些函数或方法可以用于连接LDAP服务器、执行查询、获取结果等操作。
具体的函数或方法名称可能会因使用的API或库而有所不同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、简介
Lightweight Directory Access Protocol (LDAP),轻型目录访问协议是一个访问在线目录服务的协议。
下面的例子中简单介绍在java中队ldap的增删该查功能。
目录结构为:
CD=CAS,DC=MYDC
--cn=users
----uid=zhangsan
二、示例
1、通过LdapContext连接ldap
[java]
/**
* 连接LDAP
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public LdapContext connetLDAP() throws NamingException {
// 连接Ldap需要的信息
String ldapFactory = "com.sun.jndi.ldap.LdapCtxFactory";
String ldapUrl = "ldap:/IP:port";// url
String ldapAccount = "cn=root"; // 用户名
String ldapPwd = "password";//密码
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;
}
2、增加用户zhangsan
[java]
// 添加
public void testAdd() throws Exception {
LdapContext ctx = connetLDAP();
Attributes attrs = new BasicAttributes(true);
Attribute objclass = new BasicAttribute("objectclass");
// 添加ObjectClass
String[] attrObjectClassPerson = { "inetOrgPerson", "organizationalPerson", "person", "top" };
Arrays.sort(attrObjectClassPerson);
for (String ocp : attrObjectClassPerson) {
objclass.add(ocp);
}
attrs.put(objclass);
String uid = "zhangsan";
String userDN = "uid=" + uid + "," + "cn=users,dc=cas,dc=mydc";
// 密码处理
// attrs.put("uid", uid);
attrs.put("cn", uid);
attrs.put("sn", uid);
attrs.put("displayName", "张三");
attrs.put("mail", "abc@");
attrs.put("description", "");
attrs.put("userPassword", "Passw0rd".getBytes("UTF-8"));
ctx.createSubcontext(userDN, attrs);
}
3、删除用户zhangsan
[java]
//删除
public void testRemove() throws Exception {
LdapContext ctx = connetLDAP();
String uid = "zhangsan";
String userDN = "uid=" + uid + "," + "cn=users,dc=cas,dc=mydc";
ctx.destroySubcontext(userDN);
}
4、修改zhangsan的邮件地址
[java]
//修改
public boolean testModify() throws Exception {
boolean result = true;
LdapContext ctx = connetLDAP();
String uid = "zhangsan";
String userDN = "uid=" + uid + "," + "cn=users,dc=cas,dc=mydc";
Attributes attrs = new BasicAttributes(true);
attrs.put("mail", "zhangsan@");
ctx.modifyAttributes(userDN, DirContext.REPLACE_ATTRIBUTE, attrs);
return result;
}
5、查找用户
[java]
//查询
public void testSearch() throws Exception {
LdapContext ctx = connetLDAP();
// 设置过滤条件
String uid = "zhangsan";
String filter = "(&(objectClass=top)
(objectClass=organizationalPerson)(uid=" + uid + "))";
// 限制要查询的字段内容
String[] attrPersonArray = { "uid", "userPassword", "displayName", "cn", "sn", "mail", "description" };
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// 设置将被返回的Attribute
searchControls.setReturningAttributes(attrPersonArray);
// 三个参数分别为:
// 上下文;
// 要搜索的属性,如果为空或 null,则返回目标上下文中的所有对象;
// 控制搜索的搜索控件,如果为 null,则使用默认的搜索控件
NamingEnumeration<SearchResult> answer = ctx.search
("cn=users,dc=cas,dc=mydc", filter.toString(), searchControls);
// 输出查到的数据
while (answer.hasMore()) {
SearchResult result = answer.next();
NamingEnumeration<? extends Attribute> attrs = result.getAttributes ()。
getAll();
while (attrs.hasMore()) {
Attribute attr = attrs.next();
System.out.println(attr.getID() + "=" + attr.get());
}
System.out.println("============");
}
}。