隔叶黄莺 The Blog of Unmi

〖隔叶黄莺三四声,挂壁飞瀑千万尘。若是人间无净土,此处为何妙语真! 隔叶黄莺四字,本非取自此句,而有寄寓他意,因见妙语,亦与予心合!〗

BlogJava 首页 新随笔 联系 聚合 管理
  412 Posts :: 105 Stories :: 1357 Comments :: 0 Trackbacks

openldap 比起其他商业目录服务器(比如 IBM Directory Server),特别的轻巧,十分适合于本地开发测试用,在产品环境中的表现也很优秀。

openldap 软件在它的官方网站 http://www.openldap.org, 不过下载过来是源代码,并没有包含 win32 下的 Makefile 文件,只提供了在 Unix/Linux 下编译用的 Makefile。所以相应的在网上介绍在 windows 下安装使用 openldap 的资料比较少,而在 Unix/Linux 下应用文档却很丰富。

本文实践了在 Windows 下安装配 openldap,并添加一个条目,LdapBrowser 浏览,及 Java 程序连接 openldap 的全过程。

1. 下载安装 openldap for windows,当前版本2.2.29
    下载地址:http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe
    相关链接:http://lucas.bergmans.us/hacks/openldap/
   安装很简单,一路 next 即可,假设我们安装在 c:\openldap

2. 配置 openldap,编辑 slapd.conf 文件
   1) 打开 c:\openldap\slapd.conf,找到
    include  ./schema/core.schema,在它后面添加
    include  ./schema/cosine.schema
    include  ./schema/inetorgperson.schema

    接下来的例子只需要用到以上三个 schema,当然,如果你觉得需要的话,你可以把其他的 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

   2) 还是在 slapd.conf 文件中,找到
    suffix  "dc=my-domain,dc=com"
    rootdn  "cn=Manager,dc=my-domain,dc=com"
    把这两行改为
    suffix "o=tcl,c=cn" 
    rootdn "cn=Manager,o=tcl,c=cn" 

    suffix 就是看自己如何定义了,后面步骤的 ldif 文件就必须与它定义了。还要注意到这个配置文件中有一个 rootpw  secret,这个 secret 是 cn=Manager 的密码,以后会用到,不过这里是明文密码,你可以用命令: slappasswd -h {MD5} -s secret 算出加密的密码 {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ== 取代配置中的 secret。

3. 启动 openldap
    CMD 进入到 c:\openldap 下,运行命令 slapd -d 1
    用可以看到控制台下打印一片信息,openldap 默认是用的 Berkeley DB 数据库存储目录数据的。
    如果你安装时选择了安装 install OpenLDAP-slapd as NT service 服务,你可以在系统服务中启动 OpenLDAP Directory Service。

4. 建立条目,编辑导入 ldif 文件
   1) 新建一个 ldif(LDAP Data Interchanged Format) 文件(纯文本格式),例如 test.ldif,文件内容如下:
    
dn: o=tcl,c=cn
objectClass: dcObject
objectClass: organization
o: tcl
dc: com

dn: uid=Unmi, o=tcl,c=cn
uid: Unmi
objectClass: inetOrgPerson
mail: fantasia@sina.com
userPassword:: MTIzNDU2
labeledURI: http://unmi.blogcn.com
sn: Qiu
cn:: 6ZqU5Y+26buE6I66

   2) 执行命令:ldapadd -x -D "cn=manager,o=tcl,c=cn" -w secret -f test.ldif
    导入组织信息和一个用户 uid=Unmi 
    你可以用 LdapBrower 来导入这个 ldif 文件。

5. LdapBrowser 浏览
可点击链接 http://www.blogjava.net/Files/Unmi/LdapBrowser282.rar 下载,其中已配置好了 OpenLdap_Localhost

   1) 设置如下图所示:
LdapBrowserSettings

指定了 Host 为 localhost 之后,可以点击 Fetch DNs 按钮显示出 o=tcl,c=cn 来,如果要能在 LdapBrowser 中对数据能修改就不能用 Anonymous bind, 必须填上 User DN: cn=manager,Passwer: secret。

   2) 看到的效果是:
LdapBrowser

6. Java 连接 openldap

  1. import  java.util.Hashtable;   
  2. import  javax.naming.Context;   
  3. import  javax.naming.NamingException;   
  4. import  javax.naming.directory.DirContext;   
  5. import  javax.naming.directory.InitialDirContext;   
  6.     
  7. public   class  LDAPTest {   
  8.    public   static   void  main(String[] args) {   
  9.     LDAPTest LDAPTest1 =  new  LDAPTest();   
  10.     String root =  "o=tcl,c=cn" //root   
  11.     Hashtable env =  new  Hashtable();   
  12.     env.put(Context.INITIAL_CONTEXT_FACTORY,  "com.sun.jndi.ldap.LdapCtxFactory" );   
  13.     env.put(Context.PROVIDER_URL,  "ldap://localhost/"  + root);       
  14.     env.put(Context.SECURITY_AUTHENTICATION,  "simple" );   
  15.     env.put(Context.SECURITY_PRINCIPAL,  "cn=Manager,o=tcl,c=cn" );   
  16.     env.put(Context.SECURITY_CREDENTIALS,  "secret" );   
  17.     DirContext ctx =  null ;   
  18.      try  {   
  19.       ctx =  new  InitialDirContext(env);   
  20.       System.out.println( "认证成功" );   
  21.     }   
  22.      catch  (javax.naming.AuthenticationException e) {   
  23.       e.printStackTrace();   
  24.       System.out.println( "认证失败" );   
  25.     }   
  26.      catch  (Exception e) {   
  27.       System.out.println( "认证出错:" );   
  28.       e.printStackTrace();   
  29.     }   
  30.     
  31.      if  (ctx !=  null ) {   
  32.        try  {   
  33.         ctx.close();   
  34.       }   
  35.        catch  (NamingException e) {   
  36.          //ignore   
  37.       }   
  38.     }   
  39.   }   
  40. }  
代码中还没有实现用户的查找,读取、修改条目属性的操作

参考资料:1. 如何设置一个基本的OpenLDAP Server
           2. windows下openldap的安装与java操作测试
           3. LDAP 入门知识
           4. OpenLDAP学习笔记

下一步计划是:
    1. 完成 Apache 与 openldap 的集成
    2. 完成 Tomcat 与 openldap 的集成 
    3. 使用 spring-ldap 的 LdapTemplate 操作 openldap




[版权声明]
本站内文章,如未特别注明,均系原创或翻译之作,本人 Unmi 保留一切权利。本站原创及译作未经本人许可,不得用于商业用途及传统媒体。网络媒体可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。及此说明,重之之重。
posted on 2007-07-27 02:49 隔叶黄莺 阅读(4580) 评论(39)  编辑  收藏 所属分类: Mid-Ware

Feedback

# re: Windows下安装使用openldap 2007-11-22 14:19 无趣
问您一个简单的问题` 怎么我按您的方法去做结果把 o=tcl,c=cn 当作属性输出来 希望和您一起讨论和学习openldap `我的qq是252792733 希望尽快联系我 `!!!!  回复  更多评论
  

# re: Windows下安装使用openldap 2007-11-22 16:31 隔叶黄莺
更正一下,原来日志中的 test.ldif 文件有一个问题,其中不能直接写中文,要进行一下编码,现在已在原文中改过来了。

不然会出现以下异常
ldap_add: Invalid syntax (21)
additional info: cn: value #0 invalid per syntax  回复  更多评论
  

# re: Windows下安装使用openldap 2008-03-06 18:48 vivian
请问为什么我写test.ldif后用ldapadd命令后,在LDAP浏览器上只能看到o=tcl,c=cn的条目 而看不到Unmi条目呢 谢谢
  回复  更多评论
  

# re: Windows下安装使用openldap 2008-03-10 23:43 Unmi
执行 ldapad 命令时看后台报出了什么错误。  回复  更多评论
  

# re: Windows下安装使用openldap 2008-06-13 11:24 达到
非常感谢!!!对我很有帮助!!  回复  更多评论
  

# re: Windows下安装使用openldap 2008-08-27 09:33 heifei
请问搂主在添加条目所用的test.ldif文件中,怎么把“隔叶黄莺”转换为 “6ZqU5Y+26buE6I66”的?  回复  更多评论
  

# re: Windows下安装使用openldap 2008-08-27 10:25 隔叶黄莺
记得在 openldap 下有一个命令可以完成这种转换,你也可以用程序来自己完成,过程是
"隔叶黄莺".getBytes("UTF-8"),然后 BASE64 一下就是了。  回复  更多评论
  

# re: Windows下安装使用openldap[未登录] 2008-09-23 15:53 1
11  回复  更多评论
  

# re: Windows下安装使用openldap[未登录] 2008-09-23 16:04 1
您好:按照你所说的进行配置但是仍旧出现ldap_add: Invalid syntax (21)
additional info: cn: value #0 invalid per syntax 这个错误,你说不能出现中文,那我把cn:: 6ZqU5Y+26buE6I66设置为cn: geye为什么还是出现这个错误呢,盼回答 谢谢!可以告诉一下你的信箱么 谢谢  回复  更多评论
  

# re: Windows下安装使用openldap[未登录] 2008-09-23 16:38 1
你好在问一下,userPassword:: MTIzNDU2
与cn那里必须有双冒号么??  回复  更多评论
  

# re: Windows下安装使用openldap 2008-09-23 16:57 隔叶黄莺
在 ldif 文件中把前一段

dn: o=tcl,c=cn
objectClass: dcObject
objectClass: organization
o: tcl
dc: com

删了再试试看看。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-01-15 16:23 waitingmyself
你好 我添加数据的时候提示错误 ldapadd: no DN specified
是什么原因 都是按你这样写的  回复  更多评论
  

# re: Windows下安装使用openldap 2009-01-15 16:55 隔叶黄莺
详细点呢?哪个 DN 未指定?  回复  更多评论
  

# re: Windows下安装使用openldap 2009-02-25 21:36 usky
你好,我现在想用PHP连接LDAP, 您知道怎么做吗? 我用你的方法基本已经能链接到了,但是用PHP语句:$connect = ldap_connect( "localhost", "389") ; 就会出现 Call to undefined function: ldap_connect() 这个错误。

运行这个语句 slapd.exe -d 256 ,出现 ……slapd starting 是不是表示已经启动了??

另外我想导入另一个test1.ldif 文件,但是都无法导入,应该怎么做???

  回复  更多评论
  

# re: Windows下安装使用openldap 2009-02-25 22:46 隔叶黄莺
我也正打算用 PHP 来连 LDAP,待我成功了告诉你吧。
不能导入的话,要看具体的错误提示,针对性解决。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-03-02 04:29 usky
能否留个QQ,一起研究下  回复  更多评论
  

# re: Windows下安装使用openldap[未登录] 2009-05-23 09:06 stuart
我运行java程序出错,是不是要导入什么jar包啊,什么jar包,导入到哪里,谢谢,错误提示为LDAP:error code 49-Invalid Credentials  回复  更多评论
  

# re: Windows下安装使用openldap 2009-05-23 12:11 隔叶黄莺
验证失败,请检查登录 LDAP 的用户名和密码。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-06-12 17:05 tyb
请问下 我配置好后使用客户端连接的时候报错了
javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'o=tcl,c=cn'
不知道是什么原因?  回复  更多评论
  

# re: Windows下安装使用openldap 2009-06-16 14:44 隔叶黄莺
用 LdapBrowser 看一下有没有 o=tcl,c=cn
应该是你的 ldif 文件未导入成功,看看控制台下出现了什么错误提示。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-07-22 16:35 xhx
http://baike.baidu.com/view/308683.html?fromTaglist
百度百科的一篇和你写的很相似啊,只是比你晚了一年:)  回复  更多评论
  

# re: Windows下安装使用openldap 2009-07-22 17:55 隔叶黄莺
就是我的内容啊,不知道谁贴到百度百科的,里面 tcl, Unmi 的字样都还在,但是却没有了配图。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-07-27 15:48 心情
你好,我照着你的这个教程跟着做,不过在导入ldif文件的时候总是遇到
ldap_bind: Invalid credentials (49)
这个错误,不知道如何解决,
前面你好像说是这个原因 验证失败,请检查登录 LDAP 的用户名和密码。
不过用户名和密码都检查过了,没有错啊,还是不能导入,同样的东西,在第一台电脑上就能导入,但是在第二台电脑上怎么都不能导入,  回复  更多评论
  

# re: Windows下安装使用openldap 2009-07-28 08:59 隔叶黄莺
ldap_bind: Invalid credentials (49) 是说验证错误啊,对比一下两台机器的差异看看。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-08-31 22:06 anonymous
log内容:
09:52:35 下午: Failed to add new entry uid=Unmi,o=tcl,c=cn
Root error: [LDAP: error code 21 - objectClass: value #0 invalid per syntax]
是什么原因呢?  回复  更多评论
  

# re: Windows下安装使用openldap 2009-09-01 09:20 隔叶黄莺
那几个 schema 是不是都已经包含了。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-09-02 18:14 Davy
按照你说的,导入的时候报 ldapadd: no DN specified 为什么呢?  回复  更多评论
  

# re: Windows下安装使用openldap 2009-09-02 22:26 隔叶黄莺
再具体一点的错误呢?  回复  更多评论
  

# re: Windows下安装使用openldap 2009-09-03 10:21 大力水手
@隔叶黄莺
slapadd跟ldapadd有什么不同,各自的具体功能能给说一下吗,参考文档上看不太明白  回复  更多评论
  

# re: Windows下安装使用openldap 2009-09-03 17:02 Davy
@隔叶黄莺
suffix "dc=uraira,dc=com" 是根目录是吧,怎么给添加进去多个分支呢,是用ldif导入吧?
ldif文件格式怎么写啊,o、u什么意思啊


弱智问题,实在没有找到合适的文档。。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-09-06 23:13 隔叶黄莺
我的电脑里许久没有 OpenLdap 了,看到这篇文章的受关注程度让我有些受宠了。为答谢各位的用心,特地在电脑上重新按照原文的步骤操作了一遍,也希望在此对各个问题能一一作答,还是很顺利,没出什么问题。

1. php 中出现 Call to undefined function: ldap_connect() 这个错误,要启用 PHP 的 ldap 函数库,用 phpinfo() 看看有没有 ldap 的功能,没有的话要在 php.ini 中装载 ldap 模块。

2. 出现 ……slapd starting 就表示 ldap 已经启动了,可以用 netstat -na|findstr 389 检验一下相应的 389 是否已启动,处于 listening 状态。

3. 如果是干净的环境来安装 OpenLdap 应该 ldapadd 时不会有问题,如果时执行过 ldapadd 添加了 ldif 文件中的部份条目后,再执行 ldapadd 添加同一个 ldif 文件时就需要把 ldif 文件已添加的条目删除了再执行。

4. 出现错误时还是有必要再回过头来仔细检查 sldap.conf 中的内容是不是有误。

5. 关于 slapadd 与 ldapadd 的区别,可见 http://manpages.courier-mta.org/htmlman8/slapadd.8.html,

slapadd may not provide naming or schema checks. It is advisable to use ldapadd(1) when adding new entries into an existing directory.

都是把 ldif 文件加到数据库中,推荐使用 ldapadd。看起来像是历史遗留问题,有一些 slap 和 ldap 前缀的命令,注意啦,s 紧接的是 lap,而不是 ldap.

6. 本例中的目录树离实际实用还有点远,我想我会搬一个实际应中的目录结构来,也能让大家更好的理解 Ldap 的功用。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-09-08 09:00 大力水手
@隔叶黄莺
太感谢了,热心人!期盼能把应用中的目录树给讲讲。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-12-02 17:49 yangit11
你好,我用您的ldif可以添加ldap数据库
不知道您有没有看过 《Core Java Volume II - Advanced Features 8th Edition》

Chapter 4. Database Programming
里面最后一节Introduction to LDAP


slapd.conf 文件中改成
suffix "dc=mycompany,dc=com"


rootdn "cn=Manager,dc=mycompany,dc=com"
rootpw secret



access to attr=userPassword
by dn.base="cn=Manager,dc=mycompany,dc=com" write
by self write
by * none
access to *
by dn.base="cn=Manager,dc=mycompany,dc=com" write
by self write
by * read


sample.ldif

# Define top-level entry
dn: dc=mycompany,dc=com
objectClass: dcObject
objectClass: organization
dc: mycompany
o: Core Java Team
......下面还有些,太多了就不写了

然后运行

ldapadd -f sample.ldif -x -D "cn=Manager,dc=mycompany,dc=com" -w secret

为什么总是报错呢?
ldap_bind: Invalid credentials (49)  回复  更多评论
  

# re: Windows下安装使用openldap 2009-12-02 23:49 yangit11
好了……莫名其妙,好像stop一下服务,关cmd,开cmd,start一下,就好了,中间还故意把sample.ldif内容改错了下,才能连上然后报错……  回复  更多评论
  

# re: Windows下安装使用openldap 2009-12-03 12:39 yangit11
到公司之后还是不行,发现好像是这个安装版的问题,公司电脑之前装过这里提供的这个安装版,然后之前等于一致在没有生效的slapd.conf上写东西,当然是不行了……,不过今天卸载了,清注册表,之后服务就启动不起来了,
net start *****
提示
service specific error occurred: 19

然后在家的哪个只用了OpenLDAP2.4的绿色win版,就可以了  回复  更多评论
  

# re: Windows下安装使用openldap 2009-12-03 13:23 隔叶黄莺
@yangit11
正常卸载就行,不用手工去做清注册表的工作,试着不要通过系统服务来启动 Ldap.  回复  更多评论
  

# re: Windows下安装使用openldap 2009-12-03 13:25 隔叶黄莺
@yangit11

ldap_bind: Invalid credentials (49) 一般是登陆 Ldap 的用户验证出错了,请确认下用户名,或密码。  回复  更多评论
  

# re: Windows下安装使用openldap 2009-12-04 09:35 yangit11
@隔叶黄莺
不用系统服务,直接在cmd里面启动exe就能看到错误信息了,原来是directory指到其他目录了……应该是../var/openldap-data
这个目录是存所有ldap数据库的啊,我原先以为有个ldap目录结构指这里了,这个就不要指这里了,换了个位置,结果说不存在,呵呵  回复  更多评论
  

# re: Windows下安装使用openldap 2009-12-04 10:05 yangit11
# Define top-level entry
dn: dc=mycompany,dc=com
objectClass: dcObject
objectClass: organization
dc: mycompany
o: Core Java Team

# Define an entry to contain people
# searches for users are based on this entry
dn: ou=people,dc=mycompany,dc=com
objectClass: organizationalUnit
ou: people

# Define a user entry for John Q. Public
dn: uid=jqpublic,ou=people,dc=mycompany,dc=com
objectClass: person
objectClass: uidObject
uid: jqpublic
sn: Public
cn: John Q. Public
telephoneNumber: +1 408 555 0017
userPassword: wombat

# Define a user entry for Jane Doe
dn: uid=jdoe,ou=people,dc=mycompany,dc=com
objectClass: person
objectClass: uidObject
uid: jdoe
sn: Doe
cn: Jane Doe
telephoneNumber: +1 408 555 0029
userPassword: heffalump

# Define an entry to contain LDAP groups
# searches for roles are based on this entry
dn: ou=groups,dc=mycompany,dc=com
objectClass: organizationalUnit
ou: groups

# Define an entry for the "techstaff" group
dn: cn=techstaff,ou=groups,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: techstaff
uniqueMember: uid=jdoe,ou=people,dc=mycompany,dc=com

# Define an entry for the "staff" group
dn: cn=staff,ou=groups,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: staff
uniqueMember: uid=jqpublic,ou=people,dc=mycompany,dc=com
uniqueMember: uid=jdoe,ou=people,dc=mycompany,dc=com

像这样的,在staff里面有2个员工属性uniqueMember,在java里面

DirContext con = null;
try {
con = connect(ver, host, port);

SearchControls ctls = new SearchControls();
ctls.setSearchScope(2); // 0=Base, 1=one level, 2=sub
ctls.setCountLimit(1000);
ctls.setTimeLimit(6000);
//ctls.setReturningAttributes(attribs);
ctls.setReturningAttributes(null);
NamingEnumeration res = con.search(root, filter, ctls);

while (res.hasMore()) {
SearchResult result = (SearchResult) res.next();
Attributes attrs = result.getAttributes();

NamingEnumeration attrset = attrs.getAll();
...
}

到SearchResult result = (SearchResult) res.next();的时候,result里面就只有把“uniqueMember: uid=jqpublic,ou=people,dc=mycompany,dc=com
uniqueMember: uid=jdoe,ou=people,dc=mycompany,dc=com”
合并成“
uniqueMember: uid=jqpublic,ou=people,dc=mycompany,dc=com uid=jdoe,ou=people,dc=mycompany,dc=com”了

这个有什么好办法吗?  回复  更多评论
  


专题:iPad  jQuery  Chrome OS

博客园首页  IT新闻  闪存  学英语
标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录      
该文被作者在 2008-02-16 10:23 编辑过
每天10分钟,轻松学英语


网站导航: