2024 年日本 PHP 研討會

LDAP 控制項

以下是在 PHP >= 7.3.0 中使用 LDAP 控制項的一些範例。

範例 #1 使用策略資訊進行綁定

<?php

$user
= 'cn=admin,dc=example,dc=com';
$passwd = 'adminpassword';

$ds = ldap_connect('ldap://127.0.0.1');

if (
$ds) {
$r = ldap_bind_ext($ds, $user, $passwd, [['oid' => LDAP_CONTROL_PASSWORDPOLICYREQUEST]]);

if (
ldap_parse_result($ds, $r, $errcode, $matcheddn, $errmsg, $referrals, $ctrls)) {
if (
$errcode != 0) {
die(
"錯誤: $errmsg ($errcode)");
}
if (isset(
$ctrls[LDAP_CONTROL_PASSWORDPOLICYRESPONSE])) {
$value = $ctrls[LDAP_CONTROL_PASSWORDPOLICYRESPONSE]['value'];
echo
"密碼到期時間: ".$value['expire']." 秒\n";
echo
"剩餘驗證次數: ".$value['grace']."\n";
if (isset(
$value['error'])) {
echo
"密碼策略錯誤碼: ".$value['error'];
}
}
}
} else {
die(
"無法連線到 LDAP 伺服器");
}
?>

範例 #2 僅在描述不為空時修改描述

<?php
// $link 為 LDAP 連線

$result = ldap_mod_replace_ext(
$link,
'o=test,dc=example,dc=com',
[
'description' => 'New description'],
[
[
'oid' => LDAP_CONTROL_ASSERT,
'iscritical' => TRUE,
'value' => ['filter' => '(!(description=*))']
]
]
);

// 接著使用 ldap_parse_result
?>

範例 #3 刪除前讀取一些值

<?php
// $link 為 LDAP 連線

$result = ldap_delete_ext(
$link,
'o=test,dc=example,dc=com',
[
[
'oid' => LDAP_CONTROL_PRE_READ,
'iscritical' => TRUE,
'value' => ['attrs' => ['o', 'description']]
]
]
);

// 接著使用 ldap_parse_result
?>

範例 #4 刪除一個參考

<?php
// $link 為 LDAP 連線

// 沒有控制項的話,它會刪除被參考的節點
// 務必將控制項設定為關鍵,以避免這種情況
$result = ldap_delete_ext(
$link,
'cn=reference,dc=example,dc=com',
[[
'oid' => LDAP_CONTROL_MANAGEDSAIT, 'iscritical' => TRUE]]
);

// 接著使用 ldap_parse_result
?>

範例 #5 使用分頁搜尋

<?php
// $link 為 LDAP 連線

$cookie = '';

do {
$result = ldap_search(
$link, 'dc=example,dc=base', '(cn=*)', ['cn'], 0, 0, 0, LDAP_DEREF_NEVER,
[[
'oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 2, 'cookie' => $cookie]]]
);
ldap_parse_result($link, $result, $errcode , $matcheddn , $errmsg , $referrals, $controls);
// 為簡化範例,錯誤處理未在此示範
$entries = ldap_get_entries($link, $result);
foreach (
$entries as $entry) {
echo
"cn: ".$entry['cn'][0]."\n";
}
if (isset(
$controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) {
// 必須將上次呼叫的 cookie 傳遞到下一次呼叫
$cookie = $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'];
} else {
$cookie = '';
}
// 空 cookie 表示最後一頁
} while (strlen($cookie) > 0);
?>
新增筆記

使用者貢獻的筆記 1 則筆記

snapplez
2 年前
LDAP 分頁需要 3.0 以上的協定版本。如果 LDAP_CONTROL_PAGEDRESULTS LDAP 控制項無法正常運作,請嘗試在綁定之前設定 LDAP 協定版本。

<?php

$ldapconn
= ldap_connect($ldapuri) or die("LDAP-URI 無法解析");

ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);

?>
To Top