控制是特殊对象,可以在 LDAP 请求时发送,以在执行请求时更改 LDAP 服务器的行为。服务器也可以在响应中发送控制,以提供更多信息,通常是为了回答来自请求的控制对象。
注意:
并非所有 LDAP 服务器都支持所有控制。要了解服务器支持哪些控制,您需要通过读取空 dn 并使用过滤器 (objectClass=*) 来查询根 DSE。
示例 #1 测试对分页结果控制的支持
<?php
// $ds 是目录服务器的有效链接标识符
$result = ldap_read($ds, '', '(objectClass=*)', ['supportedControl']);
if (!in_array(LDAP_CONTROL_PAGEDRESULTS, ldap_get_entries($ds, $result)[0]['supportedcontrol'])) {
die("This server does not support paged result control");
}
?>
从 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