PHP Conference Japan 2024

ldap_set_option

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ldap_set_option設定指定選項的值

描述

ldap_set_option(?LDAP\Connection $ldap, int $option, array|string|int|bool $value): bool

將指定選項的值設定為 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_CONTROLSLDAP_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 時可用。

參見

新增註解

使用者貢獻的註解 8 個註解

8
soulbros at yahoo dot com
22 年前
正如 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
6
hansfn at gmail dot com
18 年前
幸運的是,您可以在開啟連線之前開啟偵錯功能

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

這樣您至少可以在記錄中看到連線是否失敗...
2
php at richardneill dot org
2 年前
如果您想要停用 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 失敗。
2
technosophos
17 年前
以下標誌是 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。
0
Maarten at Aerobe
4 年前
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);
0
badbo_5834 at hotmail dot com
10 年前
我有以下程式碼,但你沒有重新命名 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);
0
john dot hallam at compaq dot com
22 年前
為了讓這個程式碼能運作,我必須使用 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);
-2
minusf at gmail dot com
19 年前
看起來 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;
?>
To Top