正如 john.hallam@compaq.com 上述所提及,必須設定選項 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 — 設定指定選項的值
將指定選項的值設定為 value
。
ldap
一個 LDAP\Connection 實例,由 ldap_connect() 返回,用於設定該連線的選項,或 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
的新值。
版本 | 描述 |
---|---|
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 時可用。
正如 john.hallam@compaq.com 上述所提及,必須設定選項 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_set_option 對於虛假的 ldap_connect -ions 也會回傳 1。
ldap_connect 總是回傳一個資源(在 ldap_connect 的註解中說明),
因此無法檢查 ldap 伺服器是否存在、是否運作中等等。而且因為 ldap_set_option
必須在 ldap_connect 和 ldap_bind 之間,檢查回傳值似乎沒有意義。
ldap_bind 是第一個真正可以檢查 ldap 資源是否可用的函式,這有點奇怪,因為它是使用 openldap 時
第三個會用到的函式。
它有點奇怪,ldap_bind 是第一個真正可以檢查 ldap 資源是否可用的函式,因為它是使用 openldap 時
第三個使用的函式。
實際上是使用 openldap 時的第三個函式。
<?php
$connect = ldap_connect("whatever");
$set = ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
echo $set;
?>