ldap開始使用ldap

備註

本節概述了ldap是什麼,以及開發人員可能想要使用它的原因。

它還應該提到ldap中的任何大型主題,並鏈接到相關主題。由於ldap的文檔是新的,您可能需要創建這些相關主題的初始版本。

設置PHP以使用LDAP

正確配置LDAP服務器後,現在我們要連接。例如,通過使用PHP。

  • DN =專有名稱。這意味著,您正在使用數據庫的哪個部分。可以是用戶或組(甚至是配置設置)。
  • 條目:實體,例如用戶。
  • 屬性:條目中的內容,例如姓名,電話號碼和電子郵件地址。

首先,我們定義以下內容:

$server = "server.example.com";  //this is the LDAP server you're connecting with
$ds = ldap_connect("ldaps://$server", 636); //always connect securely via LDAPS when possible

現在,我們相互聯繫。我們想要的下一件事是讓服務器知道我們是一個值得信賴的人。最簡單的解決方案是使用根DN或具有適當權限的現有用戶來查看數據庫(可能默認情況下,數據庫中的每個用戶都可以執行此操作)。我們使用bind函數進行身份驗證。

設置選項

首先,我們聲明這些選項。根據您的服務器配置,您可以將其保留。

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);

捆綁

假設您使用的是admin,密碼是pass123notsafe

$dn = "uid=admin,cn=users,dc=server,dc=example,dc=com";
$pass = "pass123notsafe";
$ldapbind = ldap_bind($ds, $dn, $pass); //this is the point we are authenticating

那太好了。我們在。現在我們可以執行許多不同的操作。例如,我們可以搜索,讀取,編寫和修改用戶甚至組。

搜索

想像一下,我們想要顯示組“用戶”的所有成員。

$dn = "cn=users,dc=server,dc=example,dc=com"; //very important: in which part of your database are you looking
$filter = "uid=*"; //don't filter anyone out (every user has a uid)
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

$results = ldap_get_entries($ds, $sr); //here we are pulling the actual entries from the search we just defined
var_dump($results); //will give you all results is array form. 

您可以使用foreach循環以一種很好的方式顯示數據。

好的,有這個嗎?現在繼續進行一些過濾。我們只想顯示已註冊電子郵件地址的“自行車所有者”組中的用戶。知道所有用戶都在cn = users中非常重要。除此之外,他們也可以是其他組的成員。

//did the connecting and binding

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com"; //note the extra "cn=groups" for looking in a group that is not "users"
$filter = "email=*"; //email address must be set but can be anything
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

現在再次繼續使用ldap_get_entries

獲得參賽作品的效率

解決效率的一個例子,對於每個條目具有大量屬性的大型數據庫而言越來越重要。特別是當您在屬性jpegphoto中存儲圖片時,當您有選擇地拉動條目時,它可能會顯著減少您的加載時間。

想像一下,我們想要尋找“自行車所有者”組中的用戶。這些條目中存儲了大量信息,假設它們具有以下屬性:cn,uid,name,displayname,mail,initials,mobile,telephonenumber,street,postaladdress,postalcode和jpegphoto。現在我們只需要他們的uid,名字和首字母。

為此,我們使用ldap_search的可選第4個參數:

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com";
$filter = "uid=*"; //
$justhese = array("uid", "name", "initials");
$sr = ldap_search($ds, $dn, $filter, $justthese) or die ("bummer"); //define your search scope

瞧,運行ldap_get_entries只會給你這些數據。

高級過濾

當然,您可以使用LDAP提取整個數據庫,並在PHP中進一步處理。但是,就像MySQL一樣,處理服務器端的效率要高得多。為了證明這一點,我們可以使用高級過濾器。

以上面的示例之一作為起點,但根據下面的行更改$ filter。在我們的示例中,我們希望顯示活動用戶的數據。通常,屬性shadowexpire用於存儲此信息。但是,這可能因各種LDAP系統而異。我們不僅要顯示的是活躍用戶, 而且他們的名稱必須以“一”開始,他們必須住在阿姆斯特丹。

基本上我們想做三件事:

  1. 最簡單:必須住在阿姆斯特丹。在此示例中,居住地存儲在屬性“postaladdress”中
$filter= "postaladdress=Amsterdam";
  1. 名稱必須以“a”開頭。在此示例中,UID由名稱組成,因此:
$filter= "uid=a*";
  1. 用戶必須處於活動狀態此值存儲在默認屬性shadowexpire ,值為-1 。根據您的服務器配置, shadowexpire可以包含無數的值,甚至可以使用日期。如果用戶處於非活動狀態,則shadowexpire將為1 。為了確保我們獲得除了那些非活動的用戶以外的所有用戶,我們不會選擇在shadowexpire = -1上進行過濾。相反,我們說我們希望它們不活躍。
$filter= "(!(shadowexpire=1))"; //NOT is represented with "!"

現在最有趣的部分:結合所有三個例子。我們可以使用括號,AND,OR和NOT表達式來完成此操作

$filter= "(&(postaladdress=Amsterdam)(uid=a*)(!(shadowexpire=1)))";

最後,我們可以使用“|”構建OR語句,例如,如果我們希望所有用戶以“a”或“b”開頭

$filter= "(|(uid=a*)(uid=n*))";

你可以無休止地結合併構建相當令人印象深刻的過濾器,享受嘗