[英]PHP LDAP search issue
我第一次嘗試在某些PHP代碼中使用LDAP。 我想確定某人是否是特定廣告組的成員。
我將其他示例中的一些代碼拼湊在一起,並且運行時沒有錯誤,但是當用戶實際上是該組的成員時,結果為0。
這是我的代碼:
$hostname="192.168.1.1";
$conn=ldap_connect($hostname, 389);
ldap_set_option ($conn, LDAP_OPT_REFERRALS, 0) or die('Unable to set LDAP opt referrals');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
if ($conn) {
$dn = "DC=domain,DC=local";
// if (!($ldapc=ldap_bind($conn,'CN=Username,CN=Users,DC=domain,DC=local','P@ssw0rd'))) {
if (!($ldapc=ldap_bind($conn,'username@domain.local','N0tMyP@ssw0rd'))) {
完整的CN =,DC =等還是@ domain.local是這里的首選方法?
另外,我假設對成員資格執行的所有搜索都將針對ldap_bind()認證的用戶嗎?
代碼繼續:
echo "<p>Error:" . ldap_error($conn) . "</p>";
echo "<p>Error number:" . ldap_errno($conn) . "</p>";
echo "<p>Error:" . ldap_err2str(ldap_errno($conn)) . "</p>";
die;
}
$attributes = array("memberOf");
$filter = "(memberOf=myGroup,OU=Application Security,DC=domain,DC=local)";
$result = ldap_search($conn, $dn, $filter, $attributes);
echo $result."<BR />";
$info = ldap_get_entries($conn, $result);
echo $info["count"]." entries returned.\n";
for ($i=0; $i < $info["count"]; $i++) {
echo $info[$i]["ou"][0];
}
} else {
echo "<h4>Unable to connect to LDAP server</h4>";
}
ldap_unbind($conn);
編輯:下面的建議后,我能夠按預期工作。 這是那些將受益的人的最終工作代碼。
$hostname="192.168.1.1";
$conn=ldap_connect($hostname, 389);
ldap_set_option ($conn, LDAP_OPT_REFERRALS, 0) or die('Unable to set LDAP opt referrals');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
if ($conn) {
$dn = "DC=domain,DC=local";
if (!($ldapc=ldap_bind($conn,'CN=Administrator,CN=Users,DC=domain,DC=local','password'))) {
echo "<p>Error:" . ldap_error($conn) . "</p>";
echo "<p>Error number:" . ldap_errno($conn) . "</p>";
echo "<p>Error:" . ldap_err2str(ldap_errno($conn)) . "</p>";
die;
}
$filter = "(memberOf=cn=Dashboard,OU=Application Security,DC=domain,DC=LOCAL)";
$result = ldap_search($conn, $dn, $filter);
// $attributes = array('samaccountname');
//$result = ldap_search($conn, $dn, $filter, $attributes);
$info = ldap_get_entries($conn, $result);
echo $info["count"]." entries returned.<br />";
for ($i=0; $i < $info["count"]; $i++) {
echo $i . " " . $info[$i]["samaccountname"][0] . "<br />";
}
} else {
echo "<h4>Unable to connect to LDAP server</h4>";
}
ldap_unbind($conn);
我個人更喜歡使用cn=...
方式綁定到目錄,因為它是通用的。 username@domain
-version僅適用於AD。
並結合到目錄的用戶是不是你用於查找組的用戶,但你正在尋找了信息的用戶。
因此,當您要綁定到LDAP服務器的用戶沒有權限查看組信息時,您將不會很幸運。 另一方面,如果您需要用該用戶登錄,則您正在查找組成員身份,因為只有知道用戶密碼后才能檢索該組成員身份。 泰銖有點奇怪,不是嗎?
而且,由於綁定到LDAP服務器的用戶只需具有對LDAP服務器的讀取權限,通常可以使用匿名綁定,而無需實際用戶進行綁定。 然后,您只需在ldap_bind
上省略用戶和密碼字段。 但這取決於服務器的設置。
要獲取查詢返回的結果數,您還可以使用ldap_count_entries($connectionHandle, $resultHandle)
-函數,但是我認為搜索過濾器中存在問題。
搜索過濾器必須包含一個查詢。 在您的情況下,您只提供一個字符串,但是不告訴LDAP-Server哪個字段將其映射到該字段。 過濾器總是看起來像這樣: <fieldname>=<querystring>
。 因此,在您的情況下,這將是memberOf=cn=mygroup,OU=Application Security,DC=domain,DC=local
。 區別在於該組由其完整DN標識(我在這里假設)是cn=mygroup,OU=Application Security,DC=domain,DC=local
-您必須進行驗證!
該查詢將返回該角色成員的所有用戶。 並且只會返回您已經知道的那些用戶的memberOf
-Attribute。 因此,您應該將$attributes
保留$attributes
空白,或者使用['cn', 'sAMAcountName', 'mail']
來獲取CN,返回的用戶ID和電子郵件地址。
在第二步中,您將必須檢查您要查找的用戶是否確實在該返回的數組中。
或者,您可以僅搜索用戶(過濾器將類似於mail=<email-address>
或sAMAcountName=<user-ID>
並獲取返回的memberOf
值。然后,您將必須查看所需的組是否是其中之一。在memberOf
-Entry中。
害怕嗎? 沒聽懂嗎 不用擔心 問!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.