正如上面的 [email protected] 所提到的,必须设置选项 LDAP_OPT_PROTOCOL_VERSION=3
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
才能使用 ldap_rename 函数。
但是,ldap_set_option() 行必须紧跟在 ldap_connect() 之后和 ldap_bind() 语句之前。
Christos Soulios
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
ldap_set_option — 设置指定选项的值
设置指定选项 option
的值为 value
。
ldap
可以是 ldap_connect() 返回的 LDAP\Connection 实例(用于设置该连接的选项),也可以是 **`null`**(用于设置全局选项)。
option
参数 option
可以是下列之一:
选项 | 类型 | 可用版本 |
---|---|---|
LDAP_OPT_DEREF |
int | |
LDAP_OPT_SIZELIMIT |
int | |
LDAP_OPT_TIMELIMIT |
int | |
LDAP_OPT_NETWORK_TIMEOUT |
int | |
LDAP_OPT_PROTOCOL_VERSION |
int | |
LDAP_OPT_ERROR_NUMBER |
int | |
LDAP_OPT_REFERRALS |
bool | |
LDAP_OPT_RESTART |
bool | |
LDAP_OPT_HOST_NAME |
string | |
LDAP_OPT_ERROR_STRING |
string | |
LDAP_OPT_DIAGNOSTIC_MESSAGE |
string | |
LDAP_OPT_MATCHED_DN |
string | |
LDAP_OPT_SERVER_CONTROLS |
array | |
LDAP_OPT_CLIENT_CONTROLS |
array | |
LDAP_OPT_X_KEEPALIVE_IDLE |
int | PHP 7.1.0 |
LDAP_OPT_X_KEEPALIVE_PROBES |
int | PHP 7.1.0 |
LDAP_OPT_X_KEEPALIVE_INTERVAL |
int | PHP 7.1.0 |
LDAP_OPT_X_TLS_CACERTDIR |
string | PHP 7.1.0 |
LDAP_OPT_X_TLS_CACERTFILE |
string | PHP 7.1.0 |
LDAP_OPT_X_TLS_CERTFILE |
string | PHP 7.1.0 |
LDAP_OPT_X_TLS_CIPHER_SUITE |
string | PHP 7.1.0 |
LDAP_OPT_X_TLS_CRLCHECK |
int | PHP 7.1.0 |
LDAP_OPT_X_TLS_CRLFILE |
string | PHP 7.1.0 |
LDAP_OPT_X_TLS_DHFILE |
string | PHP 7.1.0 |
LDAP_OPT_X_TLS_KEYFILE |
string | PHP 7.1.0 |
LDAP_OPT_X_TLS_PROTOCOL_MIN |
int | PHP 7.1.0 |
LDAP_OPT_X_TLS_RANDOM_FILE |
string | PHP 7.1.0 |
LDAP_OPT_X_TLS_REQUIRE_CERT |
int | PHP 7.0.5 |
**LDAP_OPT_SERVER_CONTROLS
** 和 **LDAP_OPT_CLIENT_CONTROLS
** 需要一个控制列表,这意味着该值必须是一个控制数组。一个控制由一个标识控制的 oid、一个可选的 value 和一个可选的 criticality 标志组成。在 PHP 中,一个控制由一个包含键为 oid 值为字符串的元素和两个可选元素组成的数组表示。可选元素是键为 value 值为字符串和键为 iscritical 值为布尔值的元素。如果未提供,iscritical 默认为 **`false`**。有关详细信息,请参阅 » draft-ietf-ldapext-ldap-c-api-xx.txt。另请参阅下面的第二个示例。
value
指定 option
的新值。
成功时返回 **`true`**,失败时返回 **`false`**。
版本 | 说明 |
---|---|
8.1.0 | 现在 ldap 参数需要一个 LDAP\Connection 实例;之前,需要一个有效的 ldap link 资源。 |
示例 #1 设置协议版本
<?php
// $ds 是一个有效的目录服务器 LDAP\Connection 实例
if (ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
echo "使用 LDAPv3";
} else {
echo "无法将协议版本设置为 3";
}
?>
示例 #2 设置服务器控制
<?php
// $ds 是一个有效的目录服务器 LDAP\Connection 实例
// 没有值的控制
$ctrl1 = array("oid" => "1.2.752.58.10.1", "iscritical" => true);
// iscritical 默认为 FALSE
$ctrl2 = array("oid" => "1.2.752.58.1.10", "value" => "magic");
// 尝试设置两个控制
if (!ldap_set_option($ds, LDAP_OPT_SERVER_CONTROLS, array($ctrl1, $ctrl2))) {
echo "无法设置服务器控制";
}
?>
注意:
此函数仅在使用 OpenLDAP 2.x.x 或 Netscape Directory SDK x.x 时可用。
正如上面的 [email protected] 所提到的,必须设置选项 LDAP_OPT_PROTOCOL_VERSION=3
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
才能使用 ldap_rename 函数。
但是,ldap_set_option() 行必须紧跟在 ldap_connect() 之后和 ldap_bind() 语句之前。
Christos Soulios
幸运的是,你可以在打开连接之前启用调试
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
这样你至少可以在日志中看到连接是否失败...
如果要禁用 TLS 证书检查(例如,因为你正在进行 SSH 端口转发,并且 ldaps 指向 localhost),则必须调用
ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT,0)
*在* 调用 ldap_connect() *之前*
如果你尝试
$ds = ldap_connect(...)
ldap_set_option($ds, LDAP_OPT_X_TLS_REQUIRE_CERT,0)
则该选项实际上不会生效,并且仍然会检查证书,并且会发生 TLS 失败..
以下标志是 LDAP_OPT_DEREF 的有效整数值(取自 ldap_read() 的文档)
LDAP_DEREF_NEVER (int 0) - (默认)从不解引用别名。
LDAP_DEREF_SEARCHING (int 1) - 搜索期间应解析别名,但在定位搜索的基本对象时不应解析。
LDAP_DEREF_FINDING (int 2) - 定位基本对象时应解析别名,但在搜索期间不应解析。
LDAP_DEREF_ALWAYS (int 3) - 应始终解析别名。
示例
<?php
ldap_set_option($ds, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS);
?>
这些定义在 C API 草案中(大概源自原始 LDAP API)。请参阅 OpenLDAP 源代码分发中包含的 draft-ietf-ldapext-ldap-c-api-xx.txt。
PHP 7.1 增加了直接配置 LDAP CA/证书环境的支持,而不是依赖环境变量。我注意到很多人在使用此功能时遇到问题。
正确的方法是
$ds=ldap_connect("ldap.google.com");
ldap_set_option(NULL, LDAP_OPT_X_TLS_CERTFILE, "/path/file.crt");
ldap_set_option(NULL, LDAP_OPT_X_TLS_KEYFILE, "/path/file.key");
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_start_tls($ds);
...
ldap_close($ds);
我有以下代码,但是 cn 没有重命名,这是为什么呢?
$TheDN = "cn=Nombre,ou=Addressbook,dc=axia-ldap,dc=net";
$newRDN = "cn=bill";
$newParent = "ou=Addressbook,dc=axia-ldap,dc=net";
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
$result = ldap_rename($ds, $TheDN, $newRDN, $newParent, TRUE);
为了使其正常工作,我必须使用 ldap_set_option 将 LDAP 版本设置为 3。这里有一个可能有帮助的示例
$TheDN = "cn=john smith,ou=users,dc=acme,dc=com";
$newRDN = "cn=bill brown";
$newParent = "ou=users,dc=acme,dc=com";
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
@$result = ldap_rename($ds, $TheDN, $newRDN, $newParent, TRUE);
看起来对于无效的 ldap_connect 连接,ldap_set_option 也会返回 1。
ldap_connect 总是返回一个资源(在 ldap_connect 的注释中有说明),因此无法检查 LDAP 服务器是否存在或存活。
并且由于 ldap_set_option 必须在 ldap_connect 和 ldap_bind 之间,因此检查返回值似乎没有意义。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。
因为 ldap_set_option 必须在 ldap_connect 和 ldap_bind 之间,因此检查返回值似乎没有意义。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。
<?php
$connect = ldap_connect("whatever");
$set = ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
echo $set;
?>