โปรแกรมพร็อกซี OpenLDAP ใช้สำหรับเป็นตัวกลางในการรับส่งคำขอและการตอบสนอง ldap ระหว่างไคลเอ็นต์และเซิร์ฟเวอร์ เซิร์ฟเวอร์ต่างๆ อาจมีการแสดง/แอตทริบิวต์ที่แตกต่างกันเพื่อหมายถึงสิ่งเดียวกัน ตัวอย่างเช่น ในเซิร์ฟเวอร์ LDAP หนึ่ง firstName อาจแสดงโดย firstName แต่ในเซิร์ฟเวอร์อื่นอาจแสดงโดย givenName อย่างไรก็ตาม จากมุมมองของไคลเอ็นต์ ไคลเอ็นต์ต้องการรับเฉพาะ firstName เท่านั้น ไคลเอ็นต์ไม่สนใจแอตทริบิวต์ด้านหลัง
ในกรณีนี้ การแมปแอตทริบิวต์สามารถช่วยให้เห็นภาพเสมือนของข้อมูลด้านหลังได้ ในโพสต์อื่น OpenLDAP Proxy -- Tricks and tips เราได้แนะนำวิธีการทำงานของการแมปแอตทริบิวต์โดยใช้ overlay rwm วิธีนี้ทำงานได้ดีมากเมื่อเรามีเซิร์ฟเวอร์ LDAP ด้านหลังเพียงหนึ่งเดียวที่จะทำการพร็อกซี
อย่างไรก็ตาม ถ้าเราตั้งค่าเซิร์ฟเวอร์ LDAP สองตัวขึ้นไปสำหรับ backend database meta จะเกิดอะไรขึ้น เนื่องจาก rwm-map จะใช้การแมปแบบทั่วโลก แต่ไม่ใช่แบบตามเซิร์ฟเวอร์ การแมปแอตทริบิวต์อาจไม่ทำงานกับบางเซิร์ฟเวอร์ ซึ่งจะเป็นปัญหา มาดูกันว่าจะเกิดขึ้นได้อย่างไร
สมมติว่ามีการตั้งค่าเซิร์ฟเวอร์ LDAP สองตัวใน backend meta ของ OpenLDAP proxy และแอตทริบิวต์ในเซิร์ฟเวอร์ทั้งสองนี้คือ:
เซิร์ฟเวอร์ 1
firtsName: myFirstName
sn: myLastName
เซิร์ฟเวอร์ 2
givenName: myFirstName
lastName: myLastName
ใน OpenLDAP proxy givenName ถูกแมปไปยัง firstName
overlay rwm
rwm-map attribute firstName givenName
เมื่อเรียกใช้ ldapsearch เพื่อรับแอตทริบิวต์ firstName firstName จะถูกแมปไปยัง givenName ก่อน และ OpenLDAP proxy จะส่งแอตทริบิวต์ givenName ไปยังเซิร์ฟเวอร์ 1 แต่เห็นได้ชัดว่าเซิร์ฟเวอร์ 1 ไม่มีแอตทริบิวต์ givenName ดังนั้นจึงจะไม่ส่งคืนอะไรเลย ในเซิร์ฟเวอร์ 2 เนื่องจากมี givenName ค่าชื่อจะถูกส่งคืน พฤติกรรมนี้ไม่เป็นไปตามที่คาดหวัง เห็นได้ชัดว่าเราคาดหวังว่าทั้งสองเซิร์ฟเวอร์ควรส่งคืน firstName
ดูเหมือนว่า rwm-map แก้ปัญหาไม่ได้ โชคดีที่ถ้าคุณอ่าน slapd-meta man page อย่างละเอียด คุณจะพบว่ามีตัวเลือก map ซึ่งสามารถทำการแมปแอตทริบิวต์ได้ที่ระดับเซิร์ฟเวอร์
map {attribute|objectclass} [<local name>|*] {<foreign name>|*}
นี้ แมปคลาสออบเจ็กต์และแอตทริบิวต์เช่นเดียวกับใน LDAP backend
นั่นหมายความว่าคุณสามารถแมปชื่อแอตทริบิวต์ที่แตกต่างกันไปยังชื่อแอตทริบิวต์ในพื้นที่เดียวกันสำหรับเซิร์ฟเวอร์ต่างๆ สำหรับ 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 นี่คือสิ่งที่คาดหวังไว้
ขอเตือนว่า backend ldap ไม่รองรับ map อีกต่อไป คุณควรใช้ rwm-map แทน วิธีนี้ใช้ได้ผลเนื่องจาก database ldap มีไว้สำหรับการพร็อกซีไปยังเซิร์ฟเวอร์ LDAP หนึ่งตัวเมื่อมีการร้องขอใดๆ
หวังว่าจะเป็นประโยชน์