Chinaunix首页 | 论坛 | 博客
  • 博客访问: 964556
  • 博文数量: 335
  • 博客积分: 10287
  • 博客等级: 上将
  • 技术积分: 3300
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 15:29
文章分类

全部博文(335)

文章存档

2015年(4)

2014年(15)

2013年(17)

2012年(11)

2011年(12)

2010年(96)

2009年(27)

2008年(34)

2007年(43)

2006年(39)

2005年(37)

我的朋友

分类: LINUX

2010-08-30 14:06:37

       LDAP是一种轻权的目录访问协议,由于它在读的方式上经过精心的优化,所以读的效率很高,相反对于频繁写入数据的要求是不适合的。基于LDAP的这种特性,近年来在Internet领域的应用不断加强。目前,有关LDAP的软件很多,其中最受欢迎也是最为大家所熟知的LDAP软件是基于开放源码的OpenLdap

       很早就想做一个LDAP服务器使用一下,可是一直没有时间去做,直到最近才开始。下面就将我的一些心得体会与大家共享,希望能为大家提供少许参考。

 

一、LDAP的安装:

1、  下载openldap-2.0.14.tar.gz

2、  下载ldapwebV1_1.tar.gz

openldap-2.0.14.tar.gz安装

#tar –zxvf openldap-2.0.14.tar.gz

#cd openldap-2.0.14

#./configure –prefix=/home/local/ldap

#make depend

#make

#make install

ldap数据库的建立

#cd /home/local/ldap/etc/openldap

修改slapd.conf文件如下:

suffix      “o=hitek,c=cn”

rootdn     “cn=root,o=hitek,c=cn”

#cd /home/local/ldap/var/openldap-ldbm

建立一个hitek.ldif文件,文件内容如下

dn: o=hitek,c=cn

objectclass:top

objectclass:organization

o: hitek

#cd /home/local/ldap/sbin

#./slapadd –f /home/local/ldap/openldap/slapd.conf –l /home/local/ldap/var/openldap-ldbm/hitek.ldif

#cd /home/local/ldap/libexec

#./slapd

到此为止LDAP安装过程完成。

 

二、LdapWeb的安装

       由于openldap的命令使用很不方便,所以我安装了一个基于WebLDAP接口,通过它访问LDAP数据库要方便的多。

安装LdapWeb的要求:

       支持PHPapache,并且PHPLDAP支持函数。相关的PHPapache的编译资料由读者自行查找,本文旨在阐述LDAP的内容。假设apache被安装在目录 /home/local/apache下。

 

#cp ldapwebV1_1.tar.gz /home/local/apache/htdocs

#cd /home/local/apache/htdocs

#tar –zxvf ldapwebV1_1.tar.gz

#mv ldapwebV1_1 ldapweb

#cd ldapweb/scripts

#chmod 755 *

启动apache服务器,通过访问ldapweb。然后在出现的页面中填入相应的内容,这样就可以操作LDAP数据库了。

三、LDAPC语言的接口

       openldap提供了与c语言的接口函数,这只需在编译程序时加入-lldap-llber选项。下面就以一个简单的程序说明如何通过c语言访问LDAP数据,此程序读出上文中我建立的LDAP数据库的对应条目的属性。

< example start >

#include

#include

#include

#include

 

int

main()

{

       LDAP            *ld;

       LDAPMessage     *res, *e;

       int             i;

       char            *a, *dn;

       BerElement      *ptr;

       char            **vals;

 

       /* 打开一个连接 */

       if ( (ld = ldap_open( "192.168.1.202", LDAP_PORT )) == NULL )

              exit( 1 );

 

    /* 匿名登陆 */

       if ( ldap_simple_bind_s( ld, NULL, NULL ) != LDAP_SUCCESS ) {

       ldap_perror( ld, "ldap_simple_bind_s" );

       exit( 1 );

    }

 

    /* 查询ou="efound"的条目,并返回所有属性 */

    if ( ldap_search_s( ld, "o=hitek, c=cn", LDAP_SCOPE_SUBTREE, "(ou=efound)", NULL, 0, &res ) != LDAP_SUCCESS ) {

                   ldap_perror( ld, "ldap_search_s" );

                   exit( 1 );

    }

 

    /* 分析每个返回的条目 */

    for ( e = ldap_first_entry( ld, res ); e != NULL;

       e = ldap_next_entry( ld, e ) ) {

       /* 打印对象的dn */

       dn = ldap_get_dn( ld, e );

       printf( "dn: %s\n", dn );

       free( dn );

 

       /* 打印每个属性 */

       for ( a = ldap_first_attribute( ld, e, &ptr ); a != NULL; a = ldap_next_attribute( ld, e, ptr ) ) {

           printf( "attribute: %s\n", a );

           /* 打印每个属性值 */

           vals = ldap_get_values( ld, e, a );

           for ( i = 0; vals[i] != NULL; i++ ) {

               printf( "value: %s\n", vals[i] );

           }

           ldap_value_free( vals );

       }

    }

    /* 释放查询结果 */

    ldap_msgfree( res );

    /* 关闭资源连接 */

    ldap_unbind( ld );

       exit(0);

}

< example end >

       通过gcc filename.c –o filename –lldap –llber编译程序,执行编译后的文件便可在计算机的屏幕上输出指定的条目的属性。

       有关访问LDAP的其他函数可查阅相关资料,在这里就不一一例举了。在使用LDAP提供的函数时一定要注意版本号,有些函数是LdapV.2不支持的,如果使用的话会出错。所以一定要搞清楚不同的LDAP版本所支持的函数集。有关LDAP的进一步操作请看以下网址:http://developer.netscape.com/docs/manuals/dirsdk/csdk30/contents.htm

 

注意事项:

1、  建立LDAP数据库时一定要考虑对象必须要包含的属性。当使用对象时,对对象所包含的个别属性时必须要在*.ldif文件中填写的,否则在建立LDAP数据库时是会出错的。有些读者将windows中的文本信息直接粘贴到Linuxvi中去产生*.ldif文件,这样也会导致建立LDAP数据库是出错。这是由于windows的文本信息的结束附与Linux的文本结束附不同造成的。

2、  在编译apachephp时,必须时php支持ldap函数(即编译php时要加—with-ldap参数)。如果不加的话,ldapweb将无法工作,因为ldapweb是用php写的。

3、  在使用ldapweb接口中的Modify or Move DN选项时会出错,这是由于是用了ldap_rename函数的缘故,注意在使用ldap_rename函数之前必须在ldap_connect函数之后加入ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)函数设置ldap的版本号(注意ldap-v2不支持ldap_rename函数)。

总结:

       总之,在使用LDAP时一定要注意对象类定义时的属性要求,搞清楚哪些属性是必须要在建立LDAP数据库是写的,而哪些是在建立LDAP数据库后可以添加的。不然的话,在建立LDAP数据库是会出错的。(parse error (line=*))。

阅读(713) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~