内容概览:
1.JNDI对目录服务的一些基本操作
2.解决一个小问题(错误描述):
javax.naming.directory.SchemaViolationException: [LDAP: error code 65 - object class 'javaContainer' requires attribute 'cn']; remaining name 'o=jndiTest'
--------------------------------------------------------------------------------------------------------------------------------
准备:
1.接上一篇 (windows下搭建并配置OpenLDAP服务器 )的环境
2.LDAP查看工具 LdapBrowser 下载见附件
--------------------------------------------------------------------------------------------------------------------------------
提前解决一个错误(错误描述):
javax.naming.directory.SchemaViolationException: [LDAP: error code 65 - object class 'javaContainer' requires attribute 'cn']; remaining name 'o=jndiTest'
在上一篇 中,在安装目录下的slapd.conf文件中有如下配置:
ucdata-path ./ucdata include ./schema/core.schema #加入以下内容 include ./schema/cosine.schema include ./schema/inetorgperson.schema include ./schema/corba.schema include ./schema/dyngroup.schema include ./schema/java.schema include ./schema/misc.schema include ./schema/nis.schema include ./schema/openldap.schema
可以看到有
include ./schema/java.schema
这一项,定位到该文件,安装目录/schema/java.schema,用editplus或其它软件打开
找到
objectclass ( 1.3.6.1.4.1.42.2.27.4.2.1 NAME 'javaContainer' DESC 'Container for a Java object' SUP top STRUCTURAL MUST cn)
修改为
objectclass ( 1.3.6.1.4.1.42.2.27.4.2.1 NAME 'javaContainer' DESC 'Container for a Java object' SUP top STRUCTURAL MAY(o$cn))
这样在做以下操作的时候就不会报上文提到的错误了。
--------------------------------------------------------------------------------------------------------------------------------
JNDI对LDAP的基本操作:
1.启动OpenLDAP,命令行,定位到OpenLDAP的安装目录下
slapd -d 1
2.启动 LdapBrowser,解压LdapBrowser附件,进入文件夹,双击lbe.jar
如果是被压缩软件打开的话,就只有用命令行启动了,命令行,定位到该文件夹下
java -jar lbe.jar
启动后界面如下:
选择Quick Connect:
填入ldap相关信息:
注意:在选择Base DN的时候,先点击一下Fetch DNs按钮,密码就是自己设置的密码:secret
点击Connect后:
3.新建java测试类,测试方法如下:
@Test public void testMakeRoot() { String ldapServerName = "localhost"; String rootdn = "cn=Manager,o=jndiTest"; String rootpass = "secret"; String rootContext = "o=jndiTest"; // set up environment to access the server Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://" + ldapServerName + ":389/"); env.put(Context.SECURITY_PRINCIPAL, rootdn); env.put(Context.SECURITY_CREDENTIALS, rootpass); try { // obtain initial directory context using the environment DirContext ctx = new InitialDirContext(env); // now, create the root context, which is just a subcontext // of this initial directory context. ctx.createSubcontext(rootContext); } catch (NameAlreadyBoundException nabe) { System.err.println(rootContext + " has already been bound!"); } catch (Exception e) { System.err.println(e); } }
运行后,查看ldap broswer,如下图:
再添加一个测试方法:
@Test public void testLdap() { String ldapServerName = "localhost"; String rootdn = "cn=Manager,o=jndiTest"; String rootpass = "secret"; String rootContext = "o=jndiTest"; // set up environment to access the server Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://" + ldapServerName + ":389/" + rootContext); env.put(Context.SECURITY_PRINCIPAL, rootdn); env.put(Context.SECURITY_CREDENTIALS, rootpass); try { // obtain initial directory context using the environment DirContext ctx = new InitialDirContext(env); // create some random number to add to the directory Integer i = new Integer( 28420 ); System.out.println( "Adding " + i + " to directory..." ); ctx.bind( "cn=myRandomInt", i ); i = new Integer( 98765 ); System.out.println( "i is now: " + i ); i = (Integer) ctx.lookup( "cn=myRandomInt" ); System.out.println( "Retrieved i from directory with value: " + i ); } catch (NameAlreadyBoundException nabe) { System.err.println(rootContext + " has already been bound!"); } catch (Exception e) { System.err.println(e); } }
运行后,结果如下:
Adding 28420 to directory... i is now: 98765 Retrieved i from directory with value: 28420
查看ldap broswer,如下图:
--------------------------------------------------------------------------------------------------------------------------------
总结:
1.初步认识了ldap
--------------------------------------------------------------------------------------------------------------------------------
参考网站:
http://www.cris.com/~adhawan/tutorial/
http://hi.baidu.com/talenian/blog/item/ebd29d26bd049326d407428b.html
http://mybeautiful.iteye.com/blog/1218806
--------------------------------------------------------------------------------------------------------------------------------
相关推荐
是一个重要的库文件,它包含了Java Naming and Directory Interface (JNDI) 的 LDAP(Lightweight Directory Access Protocol)实现。JNDI是一个接口,提供了一种标准的方式来访问命名和目录服务,而LDAP则是一种...
基于Java JNDI 操纵LDAP的基础实现,包括LDAP连接相关生命周期,认证的两种策略demo,条目的操作,schema的基础操作包括(attributeDefinition\objectDefinition\)但未包含相关syntaxDefinition的操纵. 没有资源分的朋友...
在描述中提到的链接,虽然没有提供具体内容,但通常这类博客会详细介绍如何使用JNDI来连接和操作LDAP目录。常见的步骤可能包括: 1. **配置JNDI环境**:在Java应用中,需要设置JNDI的初始上下文(Initial Context)...
通过JNDI,Java开发者可以方便地与LDAP服务器进行交互,实现诸如连接、添加、删除、修改和搜索等操作。 1. **JNDI基础** JNDI是一个接口,提供了一种统一的方式来查找和管理各种命名和目录服务,包括 LDAP、DNS、...
import com.sun.jndi.ldap.ctl.VirtualListViewControl;
LdapOperUtils 是 LDAP 操作工具类,包含了各种对 LDAP 目录进行查询、修改、添加、删除等操作的方法。这些方法通常会使用上文创建的 DirContext 对象进行实际的 JNDI 调用。例如,可能有一个 `search` 方法用于...
Java 语言通过 JNDI(Java Naming and Directory Interface)提供了对 LDAP(Lightweight Directory Access Protocol)的支持,允许开发者通过 Java 语言来操作 LDAP 服务器。LDAP 是一种常用的目录服务协议,用于...
### JNDI与LDAP基础概念 JNDI(Java Naming and Directory Interface)是Java平台的一部分,提供了一个标准API,用于访问命名和目录系统。它允许应用程序通过一个统一的接口进行对不同命名和目录服务的查找和访问...
通过上述示例,我们可以清晰地了解到如何在Java应用程序中使用JNDI进行LDAP操作,包括创建环境变量、设置参数、执行基本的目录操作等。然而,在实际部署时,还需关注安全性和性能优化等问题,确保应用程序既能高效...
在Java开发中,直接使用JNDI API操作LDAP可能会涉及很多底层细节,包括连接设置、安全配置等,这增加了代码的复杂性和出错的可能性。因此,为了简化这一过程,通常会创建一个工具类来封装这些操作,使得开发者可以更...
提供了使用fsContext服务器的unbind bind list lookup rename的相关例子,及ldap 连接的一个例子 jndi,就是命名服务(n:naming)和目录服务(d:directory). 命名服务:把对象映射到方便记忆的名字的机制.可以通过域名系统...
导入该项目后,你可以编译并运行,观察Spring LDAP和JNDI如何实现对LDAP目录的CRUD操作。 ### 结语 理解并熟练使用Spring LDAP和JNDI对于进行企业级的目录服务开发至关重要。通过这个入门级的例子,你应该能够了解...
通过上述介绍,我们了解到在Windows XP环境下安装和配置OpenLDAP的基本步骤,包括如何创建初始化数据、启动和测试LDAP服务器,以及如何使用JNDI API来编写Java程序访问LDAP服务器。这些知识点对于初学者来说非常实用...
AD ldap java集成
集成配置与集成AD以及LDAP
JNDI提供了对LDAP服务器的访问接口,允许我们使用Java代码来操作LDAP服务器。 LDAP新增 LDAP新增是指在LDAP服务器上创建新的用户或组记录。LDAP新增流程如下: 1. 客户端向LDAP服务器发送新增请求。 2. LDAP...
综上所述,"用sql语句的方式操作ldap"涉及到理解 LDAP 的特性和结构,以及如何使用JNDI API在Java应用程序中执行这些操作。通过这样的方式,开发者可以利用熟悉的SQL概念来管理LDAP目录,从而简化开发流程。