簡體   English   中英

PHP LDAP搜索問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM