文档章节

PHP-LDAP 学习笔记

_多么痛的领悟
 _多么痛的领悟
发布于 04/02 13:00
字数 2330
阅读 14
收藏 0

LDAP简介 LDAP(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找到: Mozilla OpenLDAP Project

安装与配置 PHP默认并不启用LDAP支持,PHP的LDAP模块依赖于OpenLDAP或bind9.net提供的客户端LDAP库,你必须在编译的时候使用 --with-ldap[=DIR] 才行,如果你想要SASL支持,那还必须使用 --with-ldap-sasl[=DIR] 选项,而且你的系统中必须有 sasl.h 头文件才行。

LDAP模块的行为受下面的配置指令的影响

指令 数据类型 作用域 默认值 解释 ldap.max_links 整数 PHP_INI_SYSTEM -1 每进程允许的最大LDAP连接数。"-1"表示无限制。 编程步骤 在进行LDAP编程之前,你必须知道目录服务器的下列信息:

服务器的IP地址(主机名)以及端口号 服务器的"base dn"(也就是"the world"目录下的子目录,比如:"o=My Company,c=US") 访问服务器的用户名(RDN)和密码(许多服务器允许"匿名绑定"来读取信息,但是其他操作必须有密码才行) 一般的LDAP编程步骤如下:

ldap_connect() // 连接到LDAP服务器 ldap_bind() // 匿名登陆或者认证登陆 做一些操作,比如读取、添加、删除等... ldap_unbind() // 关闭连接 LDAP常用函数简介 resource ldap_connect ([ string $hostname = NULL [, int $port = 389 ]] ) 使用指定的主机名($hostname)和端口($port)连接到LDAP服务器。

$hostname 主机名,如果服务器端是 OpenLDAP 2.x.x 或更高版本,那么还可以使用 ldap://hostname/ 格式(URL格式)。 要使用SSL连接,那么必须确保OpenLDAP和PHP都带有SSL支持,并使用 ldaps://hostname/ 的格式。 如果使用空格分隔的主机名列表(比如"192.168.0.100:389 192.168.0.101"),那么此函数将依次尝试直到连接成功为止。 $port 连接的端口(默认为389)。在使用URL格式的时候不需要使用此参数,直接在URL里面指明即可(ldap://hostname:port/)。 连接成功则返回一个LDAP连接标识符,连接失败则返回 FALSE 。 如果服务器端是 OpenLDAP 2.x.x 或更高版本,那么此函数将始终返回一个LDAP连接标识符,而永远不会失败。实际的连接动作将在接下来调用 ldap_* 函数[通常是ldap_bind()]时执行。 如果不带任何参数调用此函数,则返回上一次连接已经打开的连接标识符。

bool ldap_bind ( resource $link_identifier [, string $bind_rdn = NULL [, string $bind_password = NULL ]] ) 使用指定的RDN($bind_rdn)和密码($bind_password)绑定到LDAP目录。

$link_identifier ldap_connect()函数返回的LDAP连接标识符 $bind_rdn $bind_password 绑定时使用的RDN(Relative Distinguished Name)和密码。如果未指定则使用匿名认证。 绑定成功返回 TRUE 否则返回 FALSE 。

string ldap_error ( resource $link_identifier ) 检索LDAP操作的错误信息。

$link_identifier ldap_connect()函数返回的LDAP连接标识符 返回指定的连接标识符上最近一次LDAP操作的错误信息。

bool ldap_get_option ( resource $link_identifier , int $option , mixed &$retval ) bool ldap_set_option ( resource $link_identifier , int $option , mixed $newval ) 获取/设置LDAP选项的值。

$link_identifier ldap_connect()函数返回的LDAP连接标识符 $option LDAP选项名称,主要的选项及其数据类型如下: LDAP_OPT_DEREF(int) 搜索的时候如何处理别名,取值范围如下:LDAP_DEREF_NEVER(0,默认值), LDAP_DEREF_SEARCHING(1), LDAP_DEREF_FINDING(2), LDAP_DEREF_ALWAYS(3) LDAP_OPT_NETWORK_TIMEOUT(int) 网络超时秒数,LDAP_NO_LIMIT(0,默认值)表示永不超时。 LDAP_OPT_PROTOCOL_VERSION(int) 指定使用的LDAP协议版本,取值范围如下:LDAP_VERSION2(2,默认值), LDAP_VERSION3 (3)。 LDAP_OPT_REFERRALS(bool) LDAP库是否自动追随LDAP服务器返回的引用,取值范围如下:TRUE(1,默认值), FALSE(0)。 &$retval 接受选项值的变量 $newval 选项的新值 获取/设置成功返回 TRUE 否则返回 FALSE 。

bool ldap_add ( resource $link_identifier , string $dn , array $entry ) bool ldap_delete ( resource $link_identifier , string $dn ) 在LDAP目录中添加/删除一个项。

$link_identifier ldap_connect()函数返回的LDAP连接标识符 $dn 将要添加/删除的项目名称(distinguished name)。 $entry 指定新项内容的关联数组(attribute=>value)。如果value也是一个数组,那么必须是从0开始的索引数组。例如: $entry["bool"]='TRUE'; $entry["int"]='-3'; $entry["mail"]='jonj@example.com'; $entree["tel"][0] = "2222222"; $entree["tel"][1] = "4444444"; 添加/删除成功返回 TRUE 否则返回 FALSE 。

mixed ldap_compare ( resource $link_identifier , string $dn , string $attribute , string $value ) 检查LDAP目录项$dn的$attribute属性值与给定的$value是否相同。注意:不能用来比较二进制数据!

$link_identifier ldap_connect()函数返回的LDAP连接标识符 $dn LDAP项的名称(distinguished name) $attribute 属性名 $value 给定的值 相同返回 TRUE ,不同返回 FALSE ,遇见错误返回 -1

resource ldap_read ( resource $link_identifier , string $base_dn , string $filter [, array $attributes [, int $attrsonly [, int $sizelimit [, int $timelimit [, int $deref ]]]]] ) resource ldap_list ( resource $link_identifier , string $base_dn , string $filter [, array $attributes [, int $attrsonly [, int $sizelimit [, int $timelimit [, int $deref ]]]]] ) resource ldap_search ( resource $link_identifier , string $base_dn , string $filter [, array $attributes [, int $attrsonly [, int $sizelimit [, int $timelimit [, int $deref ]]]]] ) 使用指定的过滤器搜索LDAP目录。三个函数的不同之处在于搜索范围不同: read仅搜索$base_dn本身(LDAP_SCOPE_BASE),相当于从目录中读取一个条目(entry)。 list仅搜索$base_dn的下一级对象(LDAP_SCOPE_ONELEVEL),不包含本身,相当于"ls"命令。 search搜索$base_dn本身及其所有子对象(LDAP_SCOPE_SUBTREE),相当于搜索整个目录树。

$link_identifier ldap_connect()函数返回的LDAP连接标识符 $base_dn 将要被搜索的目录的DN $filter 搜索过滤器。比如"(objectClass=)"表示搜索所有条目(对于read函数则表示所有属性)。 其语法规则在RFC2254中描述,例如:"(|(sn=$person)(givenname=$person*))" $attributes 需要检索的属性名称数组,比如:array("mail", "sn", "cn")。 注意:不管有没有指定,"dn"属性的值总会被返回。 如果不指定此参数,那么将返回所有的属性值。 $attrsonly 默认值"0"表示同时获取属性的类型(attribute type)和属性的值(attribute value)。 非默认值"1"表示仅获取属性的类型(attribute type)。 $sizelimit 限定最多返回多少条记录。默认值"0"表示没有限制。注意:这个参数不能超越服务器的限制。 $timelimit 限定搜索操作最大允许进行多少秒。默认值"0"表示没有限制。注意:这个参数不能超越服务器的限制。 $deref 指定搜索的时候如何处理别名。取值范围如下: LDAP_DEREF_NEVER(默认) 在搜索中或者查找那基础对象时做不复引用别名 LDAP_DEREF_SEARCHING 在基础对象的附属的搜索中而不是查找那基础对象时做复引用别名 LDAP_DEREF_FINDING 在基础对象而不是其附属的搜索中做复引用别名 LDAP_DEREF_ALWAYS 在搜索中或者查找那基础对象时做都复引用别名 成功返回一个结果集的资源描述符,通常被其他函数以$result_identifier引用,失败返回FALSE

array ldap_get_entries ( resource $link_identifier , resource $result_identifier ) 返回前一次搜索操作的结果集,包括每一项的属性和属性值。

$link_identifier ldap_connect()函数返回的LDAP连接标识符 $result_identifier ldap_read/ldap_list/ldap_search函数返回的结果集的资源描述符。 成功返回一个包含结果集的多维数组,失败返回FALSE。 注意:结果集数组的属性索引将被转换成小写字母(对于LDAP来说属性是大小写无关的)。 结果集数组的结构如下所示:

return_value["count"] = 结果集中的条目总数(包含第零项) return_value[0] : 对结果集中第零项(一般不同于后面的常规项)的详细信息的引用

return_value[i]["dn"] = 结果集中第 i 个条目的 DN return_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 个值 bool ldap_unbind ( resource $link_identifier ) 解除绑定,也就是关闭LDAP连接。

$link_identifier ldap_connect()函数返回的LDAP连接标识符 成功返回 TRUE 否则返回 FALSE 。

本文转载自:http://www.jinbuguo.com/php/php-ldap.html

共有 人打赏支持
_多么痛的领悟
粉丝 0
博文 64
码字总数 10258
作品 0
延庆
程序员
私信 提问
LDAP和单点登录

构建团队协作体系的时候,需要涉及到众多的服务器。比如svn,jekins,nexus等。如果没一个系统中都有一个账号体系,那么每增加一个成员的时候,就要在众多的系统中录入用户,这就是一件很繁琐的...

miaojiangmin
2016/11/18
30
0
Java 中 LDAP 的使用与整理

文前说明 作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。 本文仅供学习交流使用,侵权必删。 不用...

羽杰
01/10
0
0
OpenLDAP学习笔记

(1) 何时使用LDAP ---------------------------------------------------------------------------------- 原则上,LDAP 在目的上类似于 NIS。两者都将一些关于网络 配置的 结构化信息从客户...

oschina
2008/09/17
6.2K
4
OpenLDAP学习笔记(基于OpenLDAP-2.4.x)

1.1、什么是目录服务(Directory Services)? 目录是一个特殊的数据库,专门用于搜索和浏览,另外也支持基本的查询和更新功能。 目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它...

skypeGNU1
2017/06/18
0
0
读《PHP和MySQL Web开发》

【第一部分】PHP基础与入门 1、PHP学习笔记1:基础知识快速浏览 http://my.oschina.net/bluefly/blog/472673 2、PHP学习笔记2:文件 http://my.oschina.net/bluefly/blog/477601 3、PHP学习笔...

slyso
2015/07/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux之自定义命令

本人使用的是ubuntu系统,不喜欢建各种桌面快捷链接,但是每次启动个软件,去查找又麻烦,所以自定义了命令,来快捷的启动应用: 1、修改/etc/bash.bashrc,在文件末尾,加上如下List-1中的内...

克虏伯
19分钟前
2
0
linux基础

系统安全 sudo su chmod setfacl 进程管理 w top ps kill pkill pstree killall 用户管理 id usermod useradd groupad userdel 文件系统 mount umount fsck df du 网络应用 curl telnet mail......

关元
21分钟前
2
0
Caffe-源码分析(一)

CHECK_X函数,用于比较两个blob之间的值 CHECK_EQ(x,y)<<"x!=y",EQ即equation,意为“等于”,当x!=y时,函数打印出x!=y。 CHECK_NE(x,y)<<"x=y",NE即not equation,意为“不等于”,,...

Pulsar-V
21分钟前
1
0
三星Galaxy S10可能会配备TOF 3D摄像头

12月3日消息,据Phone Arena报道,三星Galaxy S10可能会配备TOF 3D摄像头。 Phone Arena报道称三星Galaxy S10一共有五颗摄像头(前置双摄+后置三摄),而5G版本的Galaxy S10后置四颗摄像头,...

问题终结者
44分钟前
10
0
fabric增删改查Mac

备份1.3版本,重新下载1.1版本到fabric文件夹 /opt/gopath/src/github.com/hyperledger/fabric -> /opt/gopath/src/github.com/hyperledger/fabric1.3 新建/opt/gopath/src/github.com/hype......

八戒八戒八戒
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部