会员控制台 会员登陆 会员注册 最后更新 高级搜索 会员投稿 退出登陆
设为首页
收藏本站
留言给我
  首页 | 操作系统类 | 程序设计类 | 数据库类 | 应用服务类 | 网络及硬件类 | 其他技术 | GBunix论坛
操作系统类
程序设计类
数据库类
应用服务类
网络及硬件类
其他技术
Unix中文 / 应用服务类 / 其他应用 / 在Linux下实现目录服务
在Linux下实现目录服务
2004-07-15    王波    开放系统世界    点击:
在Linux下实现目录服务

作者:北京联合大学师范学院网络中心 王波

  LDAP是目录服务的一种标准。当前流行的目录服务软件如Windows 2000的活动目录,以及Novell公司的NDS等都是遵循LDAP标准的具体产品。下面将介绍如何用OpenLDAP在Linux环境实现目录服务。

  OpenLDAP 2.X的配置要点

  在OpenLDAP 2.X中有两个主要配置文件,一个是/etc/openldap/ldap.conf;另一个是/etc/openldap/slapd.conf。

  1./etc/openldap/ldap.conf文件

  该文件的配置比较简单。主要定义LDAP 全局性的内容,具体如下:

#HOST 指明LDAP server的地址
HOST 10.22.1.201         
#BASE 指明LDAP 目录树的基本dn,
BASE  dc=vttc,dc=edu,dc=cn


2./etc/openldap/slapd.conf文件

  /etc/openldap/slapd.conf是OpenLDAP最主要的配置文件。该文件定义了LDAP Server的守护进程slapd的配置情况,如下:

...
# ldbm database definitions 定义LDAP使用的数据库
database ldbm
#定义LDAP目录树的后缀
suffix      "dc=vttc,dc=edu,dc=cn" 
suffix      "o=vttc"
#定义LDAP根管理员的dn
rootdn      "cn=ldapadmin,o=vttc"
#定义LDAP根管理员的密码
rootpw      "wb123"
#以上密码为明文,也可以采用加密格式的密码如下所示
# rootpw  {crypt}ijFYNcSNctBYg
#定义LDAP数据库的存放位置,该目录应该事先建立好
directory /var/lib/ldap/vttc.edu.cn
# 建立索引
index objectClass,uid,uidNumber,gidNumber,memberUid eq
index cn,mail,surname,givenname eq,subinitial

  OpenLDAP 2.x中用suffix可以定义多个后缀。建立索引一定要在LDAP数据库创建之前,否则无效。建议用加密的口令。

  配置完文件后,即可启动LDAP服务器。以Red Hat Linux 7.2为例,执行以下命令:

$ /etc/rc.d/init.d/ldap start

  LDAP数据库的建立

  1.规划目录树的原则

  LDAP数据库是树型结构的,因此创建LDAP数据库也就是在创建一棵树。在具体创建目录数据库之前,应该仔细规划目录树的结构,当前有两种主要方案可以选择:第一种按照组织结构划分;第二种按照地理位置划分。规划目录树时可根据具体情况进行选择。

  2.建立LDAP数据库的方法

  在创建LDAP目录树的过程中,首先应该创建根。例如本例中定义的对象类型中有一个top类型,一般情况下top类型用来指定该条目位于目录树顶级。另外在定义每个条目时,可以指定多个对象类型,目的是让该条目同时具有多种类型的属性。

  在编辑完该文件后,利用系统提供的命令行工具将该文件添加到LDAP数据库中。执行如下命令:

#ldapadd -f myrootdn.ldif -xv -D "cn=ldapadmin,dc=vttc,dc=edu,dc=cn" -W

  其中,f指定LDIF格式文件名;x表示使用简单验证来代替SASL;v代表显示模式,在执行该命令时显示每步的结果,常用于调试阶段;D表示将后面指定的dn绑定到LDAP数据库;大写的W提示输入密码。

  Perl访问LDAP

  1.安装必要的软件包

  Perl访问LDAP,需要安装两个软件包:一是perl-ldap-0.2701.tar.gz,该软件包提供了Perl访问LDAP的接口函数;二是Convert-ASN1-0.16.tar.gz,该软件包实现了ASN.1格式的编码/解码的转换。由于OpenLDAP 2.X采用ASN.1语法,所以该模块是必要的。这两个软件包都可以到CPAN上下载。限于篇幅,略去安装步骤。

  2.利用Perl访问LDAP

  以上两个软件包安装成功后,就可以利用Perl来访问LDAP。下面是通过Perl程序向LDAP中增加条目的实例:

#!/usr/bin/perl
use Net::LDAP;
#绑定到LDAP SERVER
$ldap=Net::LDAP->new('10.22.1.201') or die "$@";
#向LDAP数据库中增加条目
$ldap->bind('cn=ldapadmin,o=vttc',password=>'wb123');
$result=$ldap->add('cn=yyy,dc=vttc,dc=edu,dc=cn',
attr=>['cn'=>['yyy uuu'],
'sn'=>'yyy',
'objectclass'=>['person'],
]
);
$result->code && warn "failed to add entry:",$result->error;
$ldap->unbind;
print("done!\n")

  3.基于OpenLDAP 2.X的身份验证实例

  当前,绝大多数使用Perl开发的程序都需要外部软件包来支持。下面通过一个身份验证实例说明如何利用Net::LDAP等软件包访问LDAP数据库,代码如下:

#!/usr/bin/perl
#最重要的包,是Perl访问OpenLDAP的必备软件包
use Net::LDAP;
#典型的Perl-CGI
$|=1;
print "Content-type:text/html\n\n";
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs=split(/&/,$buffer);
foreach $pair(@pairs)
{
($key,$value)=split(/=/,$pair);
$value=~tr/+//;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$FORM{$key}=$value;
}
#绑定到LDAP SERVER
$ldap=Net::LDAP->new('10.22.1.201') or die "$@";
$ldap->bind;
#在LDAP目录树中实现查询
$mesg=$ldap->search(base=>"dc=vttc,dc=edu,dc=cn",filter=>"(&(cn=$FORM{'name'}))");
$mesg->code && die $mesg->error;
#将查到Entry存到数组中
@myentries=$mesg->entries;
print ("<p>*******");
#取出查到的个数
$mycount=$mesg->count;
print "The Number of Search Result = $mycount ";
print ("*******");
if ($mycount==0)
{
print ("<p>$FORM{'name'} is not at LDAP DATABAE!!!");
}
else
{ #身份验证
my $entry=$mesg->entry(0);
$rightpasswd=$entry->get_value('userPassword');
#print ("<p>rightpasswd=$rightpasswd");
if ($rightpasswd ne $FORM{'passwd'})
{
print ("<p>Password ERROR!!!");
}
else
{
  print ("<p>Password right,You can access Internet Now!");
}
}
#解除与LDAP SERVER的绑定
$ldap->unbind;
print("done!\n") ;

了解更多详情,参与讨论,请进入GBUNIX论坛

http://www.gbunix.com/bbs/index.php
责任编辑: trotter
发表评论 查看评论 加入收藏 Email给朋友 打印本文
给该文章评分
1 2 3 4 5 6 7 8 9 10
平均得分 0, 共 0 人评分
1 2 3 4 5 6 7 8 9 10
发表评论
标题:
内容:
声明:本站资讯均来自互联网,所有文章版权归原作者和出版者所有,如涉及版权问题,请来信告知!
Copyright © 2002-2004 GBunix.com. All rights reserved.