- 浏览: 434472 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
springaop_springmvc:
apache lucene开源框架demo使用实例教程源代码下 ...
Java搜索工具——Lucene实例总结(一) -
chengang292214:
总结的不错
Web开发中的路径问题 -
liuyuanhui0301:
aka~
Java 归并排序(基于数组) -
IT人_:
不错
远程连接MySQL,防火墙阻止访问,解决办法 -
zhuchao_ko:
借鉴。
JNDI访问LDAP
1. 搭建了ldap服务器
- 下载openldap服务器软件(见附件):openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe
- 安装openldap,一路next就可以了。 默认安装位置:C:\Program Files\OpenLDAP
- 修改C:\Program Files\OpenLDAP\slapd.conf里的内容
suffix "dc=my-domain,dc=com" rootdn "cn=Manager,dc=my-domain,dc=com" 改成 suffix "dc=it,dc=com" rootdn "cn=Manager,dc=it,dc=com"
- 密码修改
修改C:\Program Files\OpenLDAP\slapd.conf里的内容: rootpw secret (可用简单模式,即明文密码如附件,也可用MD5方式加密) MD5加密方式: C:\Program Files\OpenLDAP>slappasswd -h {MD5} -s secret {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ== 将加密结果{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==替换原有的简单密码,替换后slapd.conf文件为: rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
- 修改C:\Program Files\OpenLDAP\slapd.conf文件
# # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. BASE dc=it, dc=com #URI ldap://ldap.example.com ldap://ldap-master.example.com:666 #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never
配置参考附件中的ldap.conf和slapd.conf
- 启动openldap服务
C:\Program Files\OpenLDAP>slapd -d 1
2. 手动录入数据
第一步是要建立DN # ldapadd -x -D 'cn=root,dc=it,dc=com' -W dn: dc=it,dc=com objectClass: dcObject objectClass: organization dc: it o: Corporation description: d Corporation 第二步是建立RDN: # ldapadd -x -D 'cn=root,dc=it,dc=com' -W dn: uid=qq,dc=it,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson uid: qq cn: qq sn: qq telephoneNumber: 138888888 description: openldap test telexNumber: tex-8888888 street: my street postOfficeBox: postofficebox displayName: qqdisplay homePhone: home1111111 mobile: mobile99999 mail:qq@qq.com
3. 数据录入--导入ldif文件
C:\Program Files\OpenLDAP>ldapadd -x -D "cn=root,dc=it,dc=com" -W -f test.ldif
test.ldif必须在LDAP安装目录下,即C:\Program Files\OpenLDAP
4. Java JNDI操作LDAP
- 建立连接
import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.ldap.LdapName; public class LdapTest { public LdapTest() { } public static void main(String[] args) { String root = "dc=it,dc=com"; // root Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost/" + root); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=it,dc=com"); env.put(Context.SECURITY_CREDENTIALS, "secret"); DirContext ctx = null; try { ctx = new InitialDirContext(env); System.out.println("认证成功"); } catch (javax.naming.AuthenticationException e) { e.printStackTrace(); System.out.println("认证失败"); } catch (Exception e) { System.out.println("认证出错:"); e.printStackTrace(); } if (ctx != null) { try { ctx.close(); } catch (NamingException e) { // ignore } } System.exit(0); } }
- 添加记录
import java.util.Hashtable; import javax.naming.Context; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; public class JNDIAdd { public static void main(String args[]) { try { String root = "dc=it,dc=com"; // root Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost/" + root); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=it,dc=com"); env.put(Context.SECURITY_CREDENTIALS, "secret"); // 添加方式1 直接绑定对象 DirContext ctx = new InitialDirContext(env); Person p = new Person("mewilcox", "Mark"); ctx.bind("cn=mnewilcox1", p); // end 添加方式1 // 添加方式 2 绑定属性 BasicAttributes attrs = new BasicAttributes(); BasicAttribute objclassSet = new BasicAttribute("objectClass"); // objclassSet.add("person");//可以省略 // objclassSet.add("organizationalPerson");//可以省略 objclassSet.add("inetOrgPerson");// 不可省略 attrs.put(objclassSet); attrs.put("uid", "admin5"); attrs.put("cn", "admin5"); attrs.put("sn", "admin5"); // 添加一个节点,createSubcontext方法的第一个属性的值是要修改的节点的不包含rootDN的DN ctx.createSubcontext("uid=admin5", attrs); // end 添加方式 2 ctx.close(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } }
Person.java
import java.io.Serializable; import java.rmi.Remote; import java.util.Date; //在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型 class Person implements Remote, Serializable { private static final long serialVersionUID = -8592182872966400365L; private String name; private String pass; public Person() { } public Person(String name, String pass) { this.name = name; this.pass = pass; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String toString() { return "name=" + this.getName() + "&pass=" + this.getPass(); } } // 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型 // 外部扩展,可以内部扩展也可以外部扩展 class RemoteDate extends Date implements Remote { };
- 查询记录
import java.util.Enumeration; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; 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; public class JNDISearch { // Initial context implementation public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory"; public static String MY_HOST = "ldap://localhost:389"; public static String MY_SEARCHBASE = "dc=it,dc=com"; public static String MY_FILTER = "(cn=*)"; public static void main(String args[]) { try { Hashtable env = new Hashtable(); // Specify which class to use for our JNDI provider env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX); // Specify host and port to use for directory service env.put(Context.PROVIDER_URL, MY_HOST); // Get a reference to a directory context DirContext ctx = new InitialDirContext(env); // Specify the scope of the search SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); // Perform the actual search // We give it a searchbase, a filter and a the constraints // containing the scope of the search NamingEnumeration results = ctx.search(MY_SEARCHBASE, MY_FILTER, constraints); // Now step through the search results while (results != null && results.hasMore()) { SearchResult sr = (SearchResult) results.next(); String dn = sr.getName(); System.out.println("Distinguished Name is " + dn); Attributes attrs = sr.getAttributes(); for (NamingEnumeration ne = attrs.getAll(); ne .hasMoreElements();) { Attribute attr = (Attribute) ne.next(); String attrID = attr.getID(); System.out.println(attrID + ": "); for (Enumeration vals = attr.getAll(); vals .hasMoreElements();) { System.out.println("\t " + vals.nextElement()); } } System.out.println("\n "); } } catch (Exception e) { e.printStackTrace(); System.exit(1); } } }
- 删除记录
import java.util.Hashtable; import javax.naming.Context; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; public class JNDIDel { // initial context implementation public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory"; public static String MY_HOST = "ldap://localhost:389/"; public static String MGR_DN = "uid=Manager,dc=it,dc=com"; public static String MGR_PW = "677992"; public static String MY_SEARCHBASE = "dc=it,dc=com"; public static String MY_ENTRY = "uid=qq1,dc=it,dc=com"; public static void main(String args[]) { try { String root = "dc=it,dc=com"; // root Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost/"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=it,dc=com"); env.put(Context.SECURITY_CREDENTIALS, "secret"); // Get a reference to a directory context DirContext ctx = new InitialDirContext(env); ctx.destroySubcontext(MY_ENTRY); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } }
- LDAP.zip (1.6 MB)
- 下载次数: 38
发表评论
-
Test
2014-07-11 15:51 768insert into CMLGPLGP (CMLGP_L ... -
C/C++调用Java代码 创建对象、字符串操作
2011-12-01 16:08 3705back>> 1. java对象的创建的步骤 ... -
JNI(C/C++调用Java父类/子类方法)
2011-11-30 21:56 8281back>> 1. C/C++调用Java函 ... -
C/C++调用Java代码(属性和方法)
2011-11-30 10:48 9392back>> 1. JNIEnv对象 ... -
JNI(Java调用C/C++代码)
2011-11-30 10:46 8477back>> 1. 首先在Java类中声明一 ... -
JNI(Java Native Interface)
2011-11-30 10:12 12901. 基本概念 - Java是跨平台的语言, ... -
JNDI
2011-11-27 11:22 21991. 基本概念 (参考 ) jndi ... -
Java 文件锁技术
2011-08-06 09:39 2233IRIP项目中,Agent每分钟都要向Director ... -
Java IO(文件操作工具类)
2011-07-13 18:30 4580去Java IO >> FileOperate实 ... -
XML解析(SAX解析)
2011-05-19 21:07 10991. SAX的基本原理及常用的接口 * Si ... -
java里抽象类和接口的区别
2011-03-05 23:31 820下面的这篇文章讲 ... -
Java 多线程(三)--正确理解ThreadLocal
2011-03-03 18:04 1411转自:http://www.iteye.com/topic/1 ... -
Callable 与 Runnable 的区别
2011-03-03 17:56 3267转自:http://blog.sina.com.cn/s/bl ... -
Java 多线程(二)
2011-03-03 16:21 2074并发 Table of Contents ... -
Java编码规范
2011-02-15 11:10 16321.Eclipse配置 (1) 导入o ... -
Java搜索工具——Lucene实例总结(一)
2010-12-22 21:42 17945参考网页:http://footman265.itey ... -
Java 集合--Map、HashMap、HashTable、TreeMap
2010-12-14 14:20 100971. Map基础 Map接口提供3种集 ... -
JMS在Spring框架下的应用
2010-12-07 23:51 13225上传通讯薄操作, ... -
页面自动跳转代码
2010-11-09 15:11 16281. 在body中使用onload属性 &l ... -
Java 多线程(一)
2010-07-27 18:07 1011参考自:http://lavasoft.blog.51cto. ...
相关推荐
JNDI是一个接口,提供了一种标准的方式来访问命名和目录服务,而LDAP则是一种网络协议,常用于存储和查询用户账户、组信息、配置数据等结构化信息。 JNDI的主要作用是将Java应用程序与各种不同的命名和目录服务连接...
使用JNDI操作LDAP,首先需要创建一个初始上下文(Initial Context),这是访问 LDAP 服务器的入口点。然后,通过这个上下文执行各种操作,如查找(lookup)、绑定(bind)、重新绑定(rebind)、删除(unbind)和...
在IT行业中,JNDI(Java Naming and Directory Interface)是一个标准接口,用于访问各种命名和目录服务,如LDAP(Lightweight Directory Access Protocol)。本篇内容将深入探讨如何封装JNDI操作,以便更方便地与...
### JNDI与LDAP基础概念 JNDI(Java Naming and Directory Interface)是Java平台的一部分,提供了一个标准API,用于访问命名和目录系统。它允许应用程序通过一个统一的接口进行对不同命名和目录服务的查找和访问...
提供了使用fsContext服务器的unbind bind list lookup rename的相关例子,及ldap 连接的一个例子 jndi,就是命名服务(n:naming)和目录服务(d:directory). 命名服务:把对象映射到方便记忆的名字的机制.可以通过域名系统...
- **访问LDAP**:使用 JNDI 访问 LDAP 的主要步骤包括初始化上下文环境、建立连接、执行搜索以及处理结果。通过 JNDI 的 API,可以方便地执行 LDAP 操作,例如查询、插入、修改和删除记录。 - **存储对象**:可以...
【JNDI与LDAP简介】 Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的一组API。它为多种类型的命名和目录服务提供了统一的接口,包括 Lightweight Directory Access Protocol ...
- **目录服务交互**:如何使用JNDI访问LDAP(轻量级目录访问协议)服务器,进行用户验证或数据查询。 5. **JNDI环境配置** - **jndi.properties**:配置JNDI的环境变量,如目录服务的位置和类型。 - **Java系统...
在本主题中,我们将详细探讨如何在CentOS操作系统上安装LDAP服务器,并利用Java编程语言来访问存储在LDAP中的数据。 首先,让我们详细了解一下在CentOS上安装和配置LDAP的过程: 1. **安装OpenLDAP**: 在CentOS...
通过上述介绍,我们了解到在Windows XP环境下安装和配置OpenLDAP的基本步骤,包括如何创建初始化数据、启动和测试LDAP服务器,以及如何使用JNDI API来编写Java程序访问LDAP服务器。这些知识点对于初学者来说非常实用...
1. **adminName** 和 **adminPassword**:这是用于访问LDAP服务器的身份验证凭证。 2. **ldapURL**:指定LDAP服务器的地址,格式为`LDAP://IP:端口`。 3. **INITIAL_CONTEXT_FACTORY**:设置为`...
另一种是使用自定义的Socket Factory来访问LDAP目录。 在使用SSL证书保护LDAP通讯时,客户端需要提供包含SSL证书的密钥库的位置和密码。例如,在Java中,可以使用以下代码来设置LDAP环境: Hashtable env = new ...
在Java应用中,JNDI经常用来访问和操作LDAP目录服务。通过JNDI,开发者可以搜索、添加、删除和修改目录中的条目。 4. JRMP:JRMP是Java的默认远程方法调用协议,主要用于JVM间的通信。RMI系统使用JRMP来实现客户端...
JNDI是一个API,用于访问多种命名和目录服务。在Java应用中,JNDI常用来查找和绑定资源,如数据源、邮件服务器等。虽然JNDI本身并不提供具体的目录服务,但它提供了统一的接口来与各种目录服务通信。 ### LDAP操作...
JNDI 提供了一个统一的接口来访问不同的目录服务,包括 LDAP、DNS、NIS 等。通过 JNDI,开发者可以使用 Java 语言来访问和操作 LDAP 服务器。 在本文中,我们将讨论 Java 语言如何使用 JNDI 对 LDAP 服务器进行增删...
同时,详细解释了如何使用JNDI访问LDAP(Lightweight Directory Access Protocol)目录服务,这对于构建企业级应用至关重要。 ### 6. Internationalization 为了适应全球化的软件开发需求,本书讲解了如何在Java...