OpenLDAP 代理用於在用戶端和伺服器之間代理 LDAP 請求和回應,不同的伺服器可能使用不同的表示/屬性來表示相同的事物。例如,在一個 LDAP 伺服器中,firstName 可能由 firstName 表示,在不同的伺服器中可能由 givenName 表示。但是,從用戶端的角度來看,它只想要獲取 firstName,它不關心後端屬性。
在這種情況下,屬性映射可以幫助提供後端數據的虛擬檢視。在另一篇文章 OpenLDAP Proxy -- Tricks and tips 中,我們介紹了如何使用 overlay rwm 來實現屬性映射。當我們只有一個後端 LDAP 伺服器需要代理時,這個方法非常有效。
但是,如果我們為 資料庫 meta 後端配置了兩個或更多個 LDAP 伺服器會怎樣?由於 rwm-map 會全局應用映射,而不是基於伺服器的,因此屬性映射可能無法適用於某些伺服器,這將是一個問題。讓我們看看這是如何發生的。
假設在 OpenLDAP 代理 meta 後端中已配置了兩個 LDAP 伺服器,並且這兩個伺服器中的屬性為:
伺服器 1
firtsName: myFirstName
sn: myLastName
伺服器 2
givenName: myFirstName
lastName: myLastName
在 OpenLDAP 代理中,givenName 映射到 firstName。
overlay rwm
rwm-map attribute firstName givenName
當運行 ldapsearch 以獲取 firstName 屬性時,firstName 將首先映射到 givenName,OpenLDAP 代理將將屬性 givenName 發送到伺服器 1,但顯然伺服器 1 沒有屬性 givenName,因此它將不返回任何內容。在伺服器 2 中,由於它具有 givenName,因此將返回名稱值。這種行為並非預期,顯然我們期望兩個伺服器都應該返回 firstName。
似乎 rwm-map 無法解決這個問題。幸運的是,如果您仔細閱讀 slapd-meta 手冊頁,您會發現它提供了一個 map 選項,可以在伺服器級別提供屬性映射。
map {attribute|objectclass} [<local name>|*] {<foreign name>|*}
這將映射 LDAP 後端中的物件類別和屬性。
這意味著您可以為不同的伺服器將不同的屬性名稱映射到相同的本地屬性名稱。對於 firstName,如果進行以下配置。
uri "server1"
suffixmassage "local" "target"
map attribute firstName firstName #也可以忽略
uri "server2"
suffixmassage "local" "target"
map attribute firstName givenName
對於伺服器 1,firstName 將映射到 firstName;對於伺服器 2,givenName 將映射到 firstName,並且當發出 ldapsearch 請求時,用戶端將看到從兩個伺服器返回的值。這正是預期的結果。
需要注意的是,後端 ldap 不再支援 map,您應該改用 rwm-map。這是有效的,因為 資料庫 ldap 旨在在發出任何請求時代理到一個 LDAP 伺服器。
希望這有幫助。