控制是特殊的对象,可以与 LDAP 请求一起发送以更改 LDAP 服务器在执行请求时的行为。服务器还可以与响应一起发送控制来提供更多信息,通常是为了响应来自请求的控制对象。
注意:
并非所有 LDAP 服务器都支持所有控制。要了解服务器支持哪些控制,您需要通过读取带有过滤器 (objectClass=*) 的空 dn 来查询根 DSE。
示例 #1 测试对分页结果控制的支持
<?php
// $ds 是目录服务器的有效链接标识符
$result = ldap_read($ds, '', '(objectClass=*)', ['supportedControl']);
if (!in_array(LDAP_CONTROL_PAGEDRESULTS, ldap_get_entries($ds, $result)[0]['supportedcontrol'])) {
die("此服务器不支持分页结果控制");
}
?>
从 PHP 7.3 开始,您可以使用 controls
参数在所有请求函数中发送控制。当存在函数的 ext 版本时,如果您想访问完整的响应对象并能够使用 ldap_parse_result() 从中解析响应控制,则应使用它。
controls
必须是一个数组,其中包含每个要发送的控制的数组,包含以下键
false
。
大多数控制值都是使用 BER 编码发送到服务器的。您可以自行对值进行 BER 编码,或者可以传递包含正确键的数组,以便为您完成编码。支持作为数组传递的控制包括
LDAP_CONTROL_PAGEDRESULTS
预期键为 [size] 和 [cookie]
LDAP_CONTROL_ASSERT
预期键为 filter
LDAP_CONTROL_VALUESRETURNFILTER
预期键为 filter
LDAP_CONTROL_PRE_READ
预期键为 attrs
LDAP_CONTROL_POST_READ
预期键为 attrs
LDAP_CONTROL_SORTREQUEST
预期为一个数组,其中包含键为 attr、[oid]、[reverse] 的数组。
LDAP_CONTROL_VLVREQUEST
预期键为 before、after、attrvalue|(offset, count)、[context]
以下控制不需要任何值
控制 LDAP_CONTROL_PROXY_AUTHZ
是一种特殊情况,因为其值不需要 BER 编码,因此您可以直接使用字符串作为其值。
ldap_parse_result() 解析控制时,如果支持,则值将转换为数组。这适用于
LDAP_CONTROL_PASSWORDPOLICYRESPONSE
键为 expire、grace、[error]
LDAP_CONTROL_PAGEDRESULTS
键为 size、cookie
LDAP_CONTROL_PRE_READ
键为 dn 和 LDAP 属性名称
LDAP_CONTROL_POST_READ
键为 dn 和 LDAP 属性名称
LDAP_CONTROL_SORTRESPONSE
键为 errcode、[attribute]
LDAP_CONTROL_VLVRESPONSE
键为 target、count、errcode、context