Shanghai WTO Forum

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2999|回复: 0

用Php如何操作LDAP

[复制链接]
发表于 2007-12-3 17:54:33 | 显示全部楼层 |阅读模式
<><STRONG>1 LDAP是什么</STRONG><FONT color=#0095da><FONT size=2><BR></FONT></FONT> LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。<BR>  LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要特别注意的是,LDAP通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。<BR><BR>  简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。<BR><BR> LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,其实是一话号码簿,类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络目录,也类似于你在花园中所看到的树木。<BR> LDAP是一种特殊的数据库。但是LDAP和一般的数据库不同,明白这一点是很重要的。 LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。<BR>1.1 LDAP的存储规则<BR> 区分名(DN,Distinguished Name)<BR> 和自然界中的树不同,文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性,这一属性可以帮助我们来区别这些枝叶。<BR> 在文件系统中, 这些独一无二的属性就是带有完整路径的文件名。比如/etc/passwd,该文件名在该路径下是独一无二的。当然我们可以有/usr/passwd, /opt/passwd,但是根据它们的完整路径,它们仍然是唯一的。<BR> 在LDAP中,一个条目的区分名称叫做“dn”或者叫做区分名。在一个目录中这个名称总是唯一的。比如,我的dn是"uid=aghaffar, ou=People, o=developer.ch"。不可能有相同的dn,但是我们可以有诸如"uid=aghaffar, ou=Administrators, o=developer.ch"的dn。这同上面文件系统中/etc/passwd 和 /usr/passwd的例子很类似。<BR> 我们有独一无二的属性,在"ou=Administrators, o=developer.ch" 中uid和在"ou=People, o=developer.ch"中的uid。这并不矛盾。<BR>CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;<BR>OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;<BR>O=Organization 为组织名,可以3?64个字符长<BR>C=Country为国家名,可选,为2个字符长<BR><BR> LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。<BR>mail = testmail@mccc.net<BR>othermailbox = testmailother@mccc.com<BR>givenname = givenname<BR>sn = test sn<BR>属性可添加,以下一个属性必须赋值:<BR>objectclass=person (值为:person 或 server 或 organization 或 其他自定义的值)<BR><BR><STRONG>2 Php如何操作LDAP</STRONG><FONT size=2><FONT color=#0095da><BR></FONT></FONT>2.1 Php如何与LDAP连接和关闭<BR>$ds=ldap_connect("ServerName")<BR>ServerName是LDAP的服务器名,<BR><BR>例:<BR>$ds=ldap_connect(“10.31.172.30:1000”)<BR>返回值是:true 或 false<BR><BR>关闭连接<BR>ldap_close($ds);<BR><BR>2.2 在php中如何搜索用户信息<BR></P>< class=php>$ds=ldap_connect("10.31.172.30:1000");<BR>//首先连接上服务器<BR>$justthese = array("cn","userpassword",”location”);<BR>//搜索函数中的一个参数,要求返回哪些信息,<BR>//以上传回cn,userpassword,location,这些都要求小写<BR>$sr=ldap_search($ds,"o=jite", "cn=dom*",$justthese);<BR>//第一个参数开启LDAP的代号<BR>//第二个参数最基本的 dn 条件值 , 例:”o=jite,c=cn”<BR>//第三个参数 filter 为布林条件,它的语法可以在 Netscape 站上找一份 dirsdkpg.pdf 档案.<BR>// ’o’为组织名,’cn’ 为用户名,用户名可用通配符 ’*’<BR>echo "domadmin姓氏有".ldap_count_entries($ds,$sr)." 个<p>";<BR>//ldap_count_entries($ds,$sr)传回记录总数<BR><BR>$info = ldap_get_entries($ds, $sr);<BR>//LDAP的全部传回资料<BR>echo "资料传回 ".$info["count"]."笔:<p>";<BR>for ($i=0; $i<$info["count"]; $i++) {<BR>echo "dn为:". $info[$i]["dn"] ."<br>";<BR>echo "cn为:". $info[$i]["cn"][0] ."<br>"; //显示用户名<BR>echo "email为:". $info[$i]["mail"][0] ."<p>"; //显示mail<BR>echo "email为:". $info[$i][“userpassword"][0] ."<p>"; //显示加密后的密码<BR>}<BR>2.3 添加用户<BR>$ds=ldap_connect("10.31.172.30:1000");<BR>//首先连接上服务器<BR>$r=ldap_bind($ds,"cn=domadmin,o=jite","password");<BR>//系住一个管理员,有写的权限<BR>// cn=domadmin,o=jite顺序不能变<BR>$info["cn"]="aaa"; //必填<BR>$info["userpassword"]="aaa";<BR>$info["location"]="shanghai";<BR>$info["objectclass"] = "person"; //必填person为个人,还有server…<BR>ldap_add($ds, "cn=".$info["cn"].",o=jite", $info);<BR>ldap_unbind($ds);<BR>//取消绑定<BR>ldap_close($ds);<BR>//关闭连接<BR>2.4 删除用户<BR>$ds=ldap_connect("10.31.172.30:1000");<BR>//首先连接上服务器<BR>ldap_bind($ds,"cn=domadmin,o=jite","password");<BR>//绑定管理员,有删除的权限<BR>$dn="cn=dingxf,o=jite";<BR>ldap_delete($ds, $dn);<BR>//删除用户<BR>ldap_unbind($ds);<BR>//取消绑定<BR>ldap_close($ds);<BR>//关闭连接<BR>2.5 修改用户资料<BR>$ds=ldap_connect("10.31.172.30:1000");<BR>//首先连接上服务器<BR>ldap_bind($ds,"cn=domadmin,o=jite","password");<BR>//绑定管理员,有修改的权限<BR>$dn="cn=dingxf,o=jite";<BR>//用户dn<BR>$info["userpassword"]="aaa"; //要修改的信息,放在数组变量中<BR>$info["location"]="shanghaisdaf";<BR><BR>ldap_modify($ds, $dn , $info);<BR>//修改函数<BR>ldap_unbind($ds);<BR>//取消绑定<BR>ldap_close($ds);<BR>//关闭连接<BR>2.6 用户登录验证<BR>$ds=ldap_connect("10.31.172.30:1000");<BR>//首先连接上服务器<BR>if (ldap_bind($ds,"cn=dingxf,o=jite","dingxf")){<BR>echo "验证通过";<BR>}else{<BR>echo "验证不通过";<BR>}<BR>ldap_unbind($ds);<BR>//取消绑定<BR>ldap_close($ds);<BR>//关闭连接<BR><BR></P><BR>注:此方法比较简单,实用,它也有不足之处,如果不通过,ldap_bind()提示它自带的提示语:”Warning: LDAP: Unable to bind to server: Inappropriate authentication in /home/htdocs/jldl.net/ldap/test.php3 on line 16”<BR><></P>
您需要登录后才可以回帖 登录 | 注册

本版积分规则


QQ|Archiver|mobile|The little black house|Shanghai WTO Net ( 沪ICP备10034107号-3 )

GMT+8, 2024-4-19 19:58

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表