ldap协议

前段时间一直在做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、已经完成了吗?对了!学生的详细信息还没有呐!不过先这样吧,反正记录是可以编辑的。
---------------------------------------------

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编程步骤如下:

  1. ldap_connect() // 连接到LDAP服务器
  2. ldap_bind() // 匿名登陆或者认证登陆
  3. 做一些操作,比如读取、添加、删除等...
  4. 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"]=‘[email protected]‘;
$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 。

时间: 2024-10-12 21:25:07

ldap协议的相关文章

LDAP协议介绍

LDAP协议基础概念 1. 从用途上阐述LDAP,它是一个存储静态相关信息的服务,适合"一次记录多次读取".经常使用LDAP服务存储的信息: 公司的物理设备信息(如打印机,它的IP地址.存放位置.厂商.购买时间等)  公开的员工信息(地址.电话.电子邮件-)  合同和账号信息(客户信息.产品交付日期.投标信息.项目信息-)  凭证信息(认证凭证.许可证凭证-) 2. 从数据结构上阐述LDAP,它是一个树型结构,能有效明白的描写叙述一个组织结构特性的相关信息.在这个树型结构上的每一

PHP 通过LDAP协议,操作Windows Active Directory

原文地址:http://hi.baidu.com/lllangxx/item/3ccb7cdfa13b56eb3dc2cb39 一.学习如何管理Active Directory Active Directory 循序渐进系列指南 二.ADExplorer 到网上下载一个ADExplorer,它是Active Directory浏览器,可以让我们更加清楚认识Active Directory的数据存储方式及格式. 三.域外访问Active Directory 确保将域外计算机的 DNS 分析 程序配

了解LDAP协议、数据结构与条目组件

提供:ZStack云计算 内容介绍 LDAP, 全称为轻量级目录访问协议,是一项开放协议,用于通过分层目录结构对数据进行存储与检索.LDAP是一种灵活的解决方案,适用于定义各类条目及相关性质. 对大多数用户而言,LDAP似乎难于理解--因为其使用专项术语,采用多种不太常见的缩写,且常常作为大型组件交互系统中的组成部分使用.在本教程中,我们将介绍LDAP基础概念,帮助大家顺利上手这套方案. 目录服务是什么? 目录服务用于通过键-值类型格式存储.整理及表达数据.一般来讲,目录会面向查找.搜索以及读取

Linux -- 目录服务配置及应用(LDAP协议)(1)

目录服务器 目录一般用来包含描述性的.基于属性的信息,例如,通讯簿就可使用目录的形式来保存.目录服务是一种特殊的数据库系统,专门针对数据的读取.浏览和搜索操作进行了特定的优化.目录服务器则是提供目录服务的程序,通常使用LDAP协议提供目录服务.LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)是实现提供目录服务的网络协议. 本章将介绍通过OpenLDAP架设目录服务器的操作过程,主要包括以下知识点: 了解LDAP协议. 掌握安装OpenLD

Linux -- 目录服务配置及应用(LDAP协议)(2)

14.5  设置主从LDAP服务器 在某些时候,为了对LDAP服务器进行负载均衡,可能希望设置多台LDAP服务器.对于设置多台LDAP服务器的关键问题是数据的同步问题,使用slurpd进程可进行主LDAP服务器向从LDAP服务器复制数据的操作.本节将介绍架设主从LDAP服务器的过程. 14.5.1  多台LDAP服务器工作过程 对于多台LDAP服务器,可设置一台为主服务器,其他的为从服务器.本节介绍一台从服务器的配置,若是多台从服务器也可按此步骤进行操作. 注意:在进行配置之前应首先确保每个LD

ldap统一认证架构方案及实现指南(一)

一.ldap目录服务介绍什么是目录服务?  目录是一类为了浏览和搜索数据而设计的特殊的数据库.例如,为人所熟知的微软公司的活动目录(active directory)就是目录数据库的一种.目录服务是按照树状形式存储信息的,目录包含基于属性的描述性信息,并且支持高级的过滤功能. 什么是LDAP?  LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了并且可以根据需要定制.与X.

Linux中的LDAP认证

Directory Services(目录服务)   我们知道,当局域网的规模变的越来越大时,为了方便主机管理,我们使用DHCP来实现IP地址.以太网地址.主机名和拓扑结构等的集中管理和统一分配.同 样,如果一个局域网内有许多的其它资源时,如打印机.共享文件夹等等,为了方便的定位及查找它们,一种集中定位管理的方式或许是较好的选择,DNS和 NIS都是用来实现类似管理的方法.对于局域网内的一个用户来讲,工作等其它应用需要,我们必须凭帐号登录主机.用帐号收发E-mail,甚至为了管理需要公司还需要维

LDAP认证是什么?企业必须要认证LDAP吗?

鉴于最近不少朋友在我网站留言像我资讯关于LDAP认证的相关知识,今天抽空集中给大家讲解下到底什么是LDAP认证,以及企业要不要做LDAP认证呢? 什么是LDAP认证? LDAP认证是通过WSS3.0加上轻量目录LDAP协议搭建的一种认证方式,使用https加密传输,主要用于做文档管理.LDAP认证就是把用户数据放在LDAP服务器上,通过LDAP服务器上的数据对用户进行认证处理,好比采用关系型数据库存储用户信息数据进行用户认证的道理一样. 企业是否要做LDAP身份认证? ①LDAP数据库是对读操作

OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证

导读 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化.目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力.目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略.而目录服务的更新则一般都非常简单.这种目录可以存储包括个人信息.web链结.jpeg图像等各种信息.为了访问存储在目录中的信息,就