本文共 8090 字,大约阅读时间需要 26 分钟。
前段时间一直在做LDAP+POSTFIX相关项目,先把关于LDAP的一些经验写出来,一来可能会帮助一些人,二来对我自己所学知识也是一个巩固。)
先声明:我写的只是我对LDAP的一些理解,如果我的理解错误,那就是对兄弟们的误导。所以你可以直接看文章的结尾提供的几个网址。 关于LDAP的概念随便网上有很多,我不想重复,这里只是说一下我自己的理解。 都说它是“轻量级目录协议”,太专业,我不懂,我只把它想象成“简单”的目录协议。 几个很重要的概念,以后会用到: --------------------------------------------- dn :一条记录的位置 dc :一条记录所属区域 ou :一条记录所属组织 cn/uid:一条记录的名字/ID --------------------------------------------- 实际上更多时候我只把它看成数据库。我把它和我非常熟悉的MYSQL数据库做比较,通常会得到更好的理解: MYSQL用“表”储存数据,LDAP用“树” MYSQL指定一条记录要3个条件:DB、TABLE、ROW。 LDAP却更自由,为什么呢?因为LDAP数据是“树”状的,而且这棵树是可以无限延伸的,假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?当然首先要说明是哪一棵树(dc,相当于MYSQL的DB),然后是从树根到那个苹果所经过的所有“分叉”(ou,呵呵MYSQL里面好象没有这DD),最后就是这个苹果的名字(uid,记得我们设计MYSQL或其它数据库表时,通常为了方便管理而加上一个‘id’字段吗?)。 好了!这时我们可以清晰的指明这个苹果的位置了,就是那棵“歪脖树”的东边那个分叉上的靠西边那个分叉的再靠北边的分叉上的半红半绿的……,晕了!你直接爬上去吧!我还是说说LDAP里要怎么定义一个字段的位置吧,树(dc=waibo,dc=com),分叉(ou=bei,ou=xi,ou=dong),苹果(cn=honglv),好了!位置出来了: dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=waibo,dc=com 一个有名的画家说过:“世上没有相同的2个鸡蛋”。当然也没有相同的2个苹果……,同样,在LDAP里也不可能存在2个相同的dn。 LDAP数据填充原理: 一棵树的生长,要循序渐进,如果还没有长出某个分叉,就不可能在那个分叉里长出苹果(问:FT!苹果是长在分叉上的吗?答:为了便于理解,你就当它是吧),同样,LDAP数据库也要一步步的充实,举一个学校数据库的例子,我们将要把一个庞大的学生档案放到LDAP里,大致需要这么做: --------------------------------------------- 1、建立“树根”,这是通过修改“slapd.conf”来实现的,由于现在的目的是理解,所以具体步骤就不说了,反正就是在这一步建立了一个“dc=ourschool,dc=org”这样一个“树根”。 注意:我把它理解成“目录”,或者“容器”,甚至它本身也是文件(苹果)的特殊形式,熟悉LINUX文件系统的朋友会更容易理解。 2、建立18个系,分别是“dn:ou=computer,dc=ourschool,dc=org”、“dn:ou=film,dc=ourschool,dc=org”…… 3、当然是在每个系里面建立专业,比如“dn:ou=linux,ou=computer,dc=ourschool,dc=org”…… 4、(开始长苹果吧!)加学生喽——“dn:cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org”…… 5、已经完成了吗?对了!学生的详细信息还没有呐!不过先这样吧,反正记录是可以编辑的。 ---------------------------------------------
(Lightweight Directory Access Protocol)的意思是"轻量级目录访问协议",是一个用于访问"目录服务器"(Directory Servers)的协议。这里所谓的"目录"是指一种按照树状结构存储信息的。这个概念和硬盘上的目录结构类似,不过LDAP的"根目录"必须是"The world",并且其一级子目录必须是"countries"。二级目录通常包含有公司(companies)、组织(organisations)、地点(places)等等……相应的三级子目录通常会包含人员(people)、设备(equipment)、文档(documents)等等……
当你引用硬盘上的文件时,通常是这样的:
/usr/local/myapp/docs正斜杠(/)在这里表示级别分界线,并且从左向右阅读。
而在LDAP中则通过"distinguished name"(简称"dn")来表示文件,通常像下面这样:
cn=John Smith,ou=Accounts,o=My Company,c=US逗号(,)在这里表示级别分界线,并且从右向左阅读。上述dn可以理解为:
country = US organization = My Company organizationalUnit = Accounts commonName = John Smith术语对比:
dn,entry 目录/文件attribute 属性value 值与硬盘目录一样,目录服务器上的目录结构也没有任何限制,这就意味着你必须了解一些服务器的结构信息才能写程序。
更多关于LDAP的信息可以在下面两个URL找到:
默认并不启用LDAP支持,的LDAP模块依赖于或提供的客户端LDAP库,你必须在编译的时候使用 --with-ldap[=DIR] 才行,如果你想要SASL支持,那还必须使用 --with-ldap-sasl[=DIR] 选项,而且你的系统中必须有 sasl.h 头文件才行。
LDAP模块的行为受下面的配置指令的影响
指令 | 数据类型 | 作用域 | 默认值 | 解释 |
---|---|---|---|---|
ldap.max_links | 整数 | PHP_INI_SYSTEM | -1 | 每进程允许的最大LDAP连接数。"-1"表示无限制。 |
在进行LDAP编程之前,你必须知道目录服务器的下列信息:
一般的LDAP编程步骤如下:
使用指定的主机名(hostname)和端口(hostname)和端口(port)连接到LDAP服务器。
连接成功则返回一个LDAP连接标识符,连接失败则返回 FALSE 。
如果服务器端是 OpenLDAP 2.x.x 或更高版本,那么此函数将始终返回一个LDAP连接标识符,而永远不会失败。实际的连接动作将在接下来调用 ldap_* 函数[通常是ldap_bind()]时执行。 如果不带任何参数调用此函数,则返回上一次连接已经打开的连接标识符。使用指定的RDN(bindrdn)和密码(bindrdn)和密码(bind_password)绑定到LDAP目录。
绑定成功返回 TRUE 否则返回 FALSE 。
检索LDAP操作的错误信息。
返回指定的连接标识符上最近一次LDAP操作的错误信息。
获取/设置LDAP选项的值。
获取/设置成功返回 TRUE 否则返回 FALSE 。
在LDAP目录中添加/删除一个项。
$entry["bool"]='TRUE';$entry["int"]='-3';$entry["mail"]='jonj@example.com';$entree["tel"][0] = "2222222";$entree["tel"][1] = "4444444";
添加/删除成功返回 TRUE 否则返回 FALSE 。
检查LDAP目录项dn的dn的attribute属性值与给定的$value是否相同。注意:不能用来比较二进制数据!
相同返回 TRUE ,不同返回 FALSE ,遇见错误返回 -1
使用指定的过滤器搜索LDAP目录。三个函数的不同之处在于搜索范围不同:
read仅搜索basedn本身(LDAPSCOPEBASE),相当于从目录中读取一个条目(entry)。list仅搜索basedn本身(LDAPSCOPEBASE),相当于从目录中读取一个条目(entry)。list仅搜索base_dn的下一级对象(LDAP_SCOPE_ONELEVEL),不包含本身,相当于"ls"命令。 search搜索$base_dn本身及其所有子对象(LDAP_SCOPE_SUBTREE),相当于搜索整个目录树。成功返回一个结果集的资源描述符,通常被其他函数以$result_identifier引用,失败返回FALSE
返回前一次搜索操作的结果集,包括每一项的属性和属性值。
成功返回一个包含结果集的多维数组,失败返回FALSE。
注意:结果集数组的属性索引将被转换成小写字母(对于LDAP来说属性是大小写无关的)。 结果集数组的结构如下所示:return_value["count"] = 结果集中的条目总数(包含第零项)return_value[0] : 对结果集中第零项(一般不同于后面的常规项)的详细信息的引用return_value[i]["dn"] = 结果集中第 i 个条目的 DNreturn_value[i]["count"] = 结果集中第 i 个条目的属性数量return_value[i][j] = 结果集中第 i 个条目的第 j 个属性return_value[i]["attribute"]["count"] = 结果集中第 i 个条目的"attribute"属性的值的数量return_value[i]["attribute"][j] = 结果集中第 i 个条目的"attribute"属性的第 j 个值
解除绑定,也就是关闭LDAP连接。
成功返回 TRUE 否则返回 FALSE 。