僅補充說明,這不是驗證使用者身份的方式,只是一個程式碼範例。
驗證的常見方法是取得用戶名,使用搜尋功能,可能還需要讓用戶選取以取得其 DN(單一值),然後使用該 DN 和提供的密碼嘗試綁定到 LDAP 伺服器。如果成功,則表示密碼正確。
請注意,提供的密碼「不得為空」,否則許多 LDAP 伺服器會假設您打算匿名驗證,並允許通過,讓您誤以為密碼正確。
(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)
ldap_compare — 比較指定 DN 之項目中找到的屬性值
$ldap
,$dn
,$attribute
,$value
,$controls
= null
比較 attribute
的 value
值與 LDAP 目錄項目中相同屬性的值。
ldap
一個 LDAP\Connection 實例,由 ldap_connect() 返回。
dn
LDAP 實體的識別名稱 (Distinguished Name)。
attribute
屬性名稱。
value
要比較的數值。
controls
要與請求一起發送的 LDAP 控制項 陣列。
版本 | 說明 |
---|---|
8.1.0 | ldap 參數現在需要一個 LDAP\Connection 實例;以前需要一個有效的 ldap link 資源。 |
8.0.0 |
controls 現在可以為 null;以前,它的預設值為 [] 。 |
7.3.0 | 新增了對 controls 的支援 |
以下範例示範如何檢查給定的密碼是否與指定 DN 項目中定義的密碼匹配。
範例 #1 密碼檢查的完整範例
<?php
$ds=ldap_connect("localhost"); // 假設 LDAP 伺服器在此主機上
if ($ds) {
// 綁定
if (ldap_bind($ds)) {
// 準備資料
$dn = "cn=Matti Meikku, ou=My Unit, o=My Company, c=FI";
$value = "secretpassword";
$attr = "password";
// 比較值
$r=ldap_compare($ds, $dn, $attr, $value);
if ($r === -1) {
echo "錯誤: " . ldap_error($ds);
} elseif ($r === true) {
echo "密碼正確。";
} elseif ($r === false) {
echo "猜錯了!密碼不正確。";
}
} else {
echo "無法綁定到 LDAP 伺服器。";
}
ldap_close($ds);
} else {
echo "無法連線到 LDAP 伺服器。";
}
?>
ldap_compare() 無法用於比較二進位值!
僅補充說明,這不是驗證使用者身份的方式,只是一個程式碼範例。
驗證的常見方法是取得用戶名,使用搜尋功能,可能還需要讓用戶選取以取得其 DN(單一值),然後使用該 DN 和提供的密碼嘗試綁定到 LDAP 伺服器。如果成功,則表示密碼正確。
請注意,提供的密碼「不得為空」,否則許多 LDAP 伺服器會假設您打算匿名驗證,並允許通過,讓您誤以為密碼正確。
並非可能,而是一定會。使用 PHP 4.0.4 和 openldap 1.2.9,這個小腳本即使使用了正確的密碼屬性也無法運作。如果可以的話就太好了!
有趣的例子。除了基於安全考量,很少人會允許比較密碼屬性之外,「password」這個屬性名稱與常見的 schema 不符。
驗證使用者 ID 和密碼的常用方法是嘗試使用提供的憑證進行綁定。
由於伺服器支援密碼雜湊,使用 ns directory server 和 openldap v2+ 對密碼值進行 Ldap 比較可能會失敗。