LDAP简介及其使用

2023-11-19

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模块依赖于OpenLDAPbind9.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"]='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 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LDAP简介及其使用 的相关文章

随机推荐

  • 数据中台-让数据用起来-6

    文章目录 第六章 数据开发 数据价值提炼工厂 6 1 数据计算能力的4种类型 6 1 1 批计算 6 1 2 流计算 6 1 3 在线查询 6 1 4 即席分析 6 2 离线开发 1 作业调度 2 基线控制 3 异构存储 4 代码校验 5
  • Tomcat 服务器的使用(IDEA 2021.3)

    目录 1 Tomcat 下载和安装 2 IDEA 创建 JavaWeb 项目 3 IDEA 集成 Tomcat 并发布项目 服务器是计算机的一种 它比普通计算机运行更快 负载更高 价格更贵 服务器在网络中为其它客户机 如PC机 智能设备等
  • 精致的动画特效源代码

    动画特效 css简介 代码部分 纯css3云彩动画效果 css3放大镜动画效果 jQuery游戏图片手风琴收缩切换特效 js百叶窗图片3D旋转切换特效 纯CSS3制作飞舞的火箭动画 简单易用的纯CSS3图片墙效果 一个简单好看的纯CSS3翻
  • 【风格迁移系列三】(Adain)Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization 论文解读

    最近看了这篇论文 Arbitrary Style Transfer in Real time with Adaptive Instance Normalization 由于没有详细的博客参考 还是花了一些时间来阅读论文 于是提出自己对论文的
  • 代码随想录算法训练营第一天

    Leetcode704 二分查找 题目链接 关键词 二分查找 循环不变量 区间 问题思路 二分查找的应用 关键在于循环过程中区间的维护 记住循环不变量原则 在这个问题中循环不变量是区间的定义 注意左闭右开和左开右闭的区别 class Sol
  • Apache POI组件操作Excel

    Apache的POI组件是Java操作Microsoft Office办公套件的强大API 其中对Word Excel和PowperPoint都有支持 当然使用较多的还是Excel 因为Word和PowerPoint用程序动态操作的应用较少
  • proto学习

    介绍 protocol buffers 是一种语言无关 平台无关 可扩展的序列化结构数据的方法 它可用于通信协议 数据存储等 protocol buffers的接口 c java python API doc link https deve
  • 用Python画一个生日蛋糕并写上生日祝福对象及生日祝福语

    用Python画一个生日蛋糕并写上生日祝福对象及生日祝福语 画一个双层蛋糕并点上蜡烛 代码运行时间较长 请静待惊喜出现 代码运行截图 完整程序代码 干货主要有 200 多本 Python 电子书 和经典的书籍 应该有 Python标准库资料
  • 掌握 Ajax,第 7 部分: 在请求和响应中使用 XML

    偶尔使用 Ajax 的开发人员也会注意到 Ajax 中的 x 并意识到它代表 XML XML 是编程中最常用的数据格式之一 对于异步应用程序中的服务器响应能够带来切实的好处 在本文中 您将看到服务器如何在请求响应中发送 XML 现在如果不使
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • Python中如何使用boolean类型的数据

    在写代码的过程中 遇到了定义boolean类型变量的问题 之前一直试图用java或者c定义布尔变量的方法 一直不奏效 经过一旦学习之后才明白 和java竟然只是大小写的问题 在python中将java中的true携程True 将false携
  • Educational Codeforces Round 149 (Rated for Div. 2)A~D

    Grasshopper on a Line 题意 给出n和k 求从0到n最少走几步 以及步长 要求步长不能整除k 思路 从n往下找到 k不等于0的数 输出该数和n 该数即可 如果n k 0 那就只需要一步 代码 gt File Name a
  • 探索Java8——默认方法

    文章目录 什么是默认方法 不断演进的API 初始版本API 第二版API 概述默认方法 什么是默认方法 在传统的Java程序中 实现接口的方式是通过Implements把接口中的每一个方法提供一个实现 或者从父类继承他的实现 然而 在实际开
  • redis搜索 - KEYS命令

    文章目录 KEYS命令 使用 使用场景 KEYS命令 KEYS命令用于搜索匹配某个模式的所有key 例如常见的keys 命令 会返回所有的键 Time complexity O N 使用 KEYS命令支持以下正则匹配模式 h llo mat
  • [STM32]详解单片机GPIO输入模式配置-上拉下拉与浮空

    前面说到单片机的GPIO主要输出模式主要有推挽模式和开漏模式 除了连接到片内外设的模拟输入模式和复用输入功能以外 这里再说一下通用输入模式配置 STM32单片机的通用输入模式主要有输入浮空 输入上拉与输入下拉 当配置成上拉模式 即GPIO
  • python rsa加密之后byte类型存储到数据库中_python3 rsa加密

    遇到了跟你一样的问题 此js封装的源码 如下 希望看到的大神解决了的话帮我一下 RSA a suite of routines for performing RSA public key computations in JavaScript
  • c语言字符串相关函数的分析

    c语言中 常见的字符串相关函数主要分为两类 1 与字符串长度无关的函数 如strcpy strcat strcmp 2 与字符串长度有关的函数 如strlen strncpy strncat strncmp strlen 用于求字符串的长度
  • 1130:找第一个只出现一次的字符(C C++)

    题目描述 给定一个只包含小写字母的字符串 请你找到第一个仅出现一次的字符 如果没有 输出no 输入 一个字符串 长度小于100000 输出 输出第一个仅出现一次的字符 若没有则输出no 输入样例 abcabd 输出样例 c 代码 inclu
  • 【Unity】Delegate, Event, UnityEvent, Action, UnityAction, Func 傻傻分不清

    Unity Delegate Event UnityEvent Action UnityAction Func 傻傻分不清 Delegate 委托 函数指针 一个简单的例子 一对一依赖 一个简单的例子 一对多依赖 所以话说 委托有啥用呢 事
  • LDAP简介及其使用

    LDAP简介 LDAP Lightweight Directory Access Protocol 的意思是 轻量级目录访问协议 是一个用于访问 目录服务器 Directory Servers 的协议 这里所谓的 目录 是指一种按照树状结构