分类: 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的命令使用很不方便,所以我安装了一个基于Web的LDAP接口,通过它访问LDAP数据库要方便的多。
安装LdapWeb的要求:
支持PHP的apache,并且PHP有LDAP支持函数。相关的PHP与apache的编译资料由读者自行查找,本文旨在阐述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数据库了。
三、LDAP与C语言的接口
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中的文本信息直接粘贴到Linux的vi中去产生*.ldif文件,这样也会导致建立LDAP数据库是出错。这是由于windows的文本信息的结束附与Linux的文本结束附不同造成的。
2、 在编译apache和php时,必须时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=*))。