x

บทหลัก

  1. LimeSurvey Cloud เทียบกับ LimeSurvey CE
  2. คู่มือเริ่มต้นใช้งานฉบับย่อ - LimeSurvey 3.0+
  3. การติดตั้ง - LimeSurvey CE
  4. วิธีออกแบบแบบสำรวจที่ดี (คู่มือ)
  5. เริ่มต้นใช้งาน
  6. การดูแลระบบ LimeSurvey
  7. แบบสำรวจ - บทนำ
  8. การตั้งค่าแบบสอบถาม
  9. เมนูสำรวจ
  10. โครงสร้างการสำรวจ
  11. คำถาม - บทนำ
  12. กลุ่มคำถาม - บทนำ
  13. แบบสำรวจ - การจัดการ
  14. ตัวเลือกแถบเครื่องมือแบบสำรวจ
  15. แบบสำรวจหลายภาษา
  16. ExpressionScript Engine - คู่มือเริ่มต้นอย่างรวดเร็ว
  17. ฟีเจอร์ขั้นสูงและฟีเจอร์ที่ไม่ได้จัดหมวดหมู่
  18. คำถามที่พบบ่อยทั่วไป
  19. การแก้ไขปัญหา
  20. วิธีแก้ปัญหาชั่วคราว (Workarounds)
  21. สัญญาอนุญาต
  22. บันทึกการเปลี่ยนแปลงของเวอร์ชัน
  23. ปลั๊กอิน
 Actions

การตั้งค่า LDAP

From LimeSurvey Manual

หน้านี้อาจแปลด้วยเครื่องและอาจมีข้อผิดพลาด ดูต้นฉบับภาษาอังกฤษ · ปรับปรุงคำแปลนี้
This page is a translated version of the page LDAP settings and the translation is 100% complete.
  โปรดทราบ : ฟีเจอร์นี้ช่วยให้ผู้ดูแลระบบแบบสำรวจของ LimeSurvey สามารถนำเข้าผู้เข้าร่วมผ่าน LDAP ได้ หากคุณต้องการการยืนยันตัวตนด้วย LDAP สำหรับผู้ดูแลระบบ โปรดดู ปลั๊กอิน AuthLDAP


ทั่วไป

คุณต้องเปิดใช้งานการรองรับ LDAP ใน config.php และกำหนดค่าพารามิเตอร์ LDAP ใน config/ldap.php เพื่อให้สามารถใช้งานฟังก์ชันนี้ได้

  หากต้องการใช้งาน LDAP คุณต้องตรวจสอบว่าได้ติดตั้งโมดูล LDAP ใน PHP ของคุณแล้ว โปรดดูวิธีติดตั้งส่วนขยายนี้ได้ใน เอกสารประกอบโมดูล PHP LDAP


การเปิดใช้งาน LDAP ใน config.php

  • $enableLdap: หากคุณต้องการใช้ฟังก์ชัน LDAP ใน LimeSurvey คุณต้องตั้งค่าพารามิเตอร์นี้เป็น true (ค่าเริ่มต้นคือ false):
'config'=>array(
		'debug'=>0,
		'debugsql'=>0,
		'enableLdap'=>true,
	)

การกำหนดเซิร์ฟเวอร์ LDAP

ก่อนอื่นให้กำหนดตัวเลือกการเชื่อมต่อเซิร์ฟเวอร์ LDAP ใน "application/config/ldap.php" สำหรับแต่ละเซิร์ฟเวอร์ จะมีตัวเลือกดังต่อไปนี้:

  • $serverId: จำนวนเต็มที่ใช้ระบุเซิร์ฟเวอร์ LDAP นี้ ใช้ในการกำหนดคิวรีเพื่อผูกเซิร์ฟเวอร์กับคิวรีที่ต้องการ;
  • $ldap_server[$serverId]['server']: ที่อยู่ IP หรือชื่อ DNS ของเซิร์ฟเวอร์ LDAP หากคุณใช้การเชื่อมต่อที่ปลอดภัยด้วย SSL (LDAPs หรือ LDAP+Start-TLS) ชื่อนี้ต้องตรงกับ CN ของใบรับรอง (Certificate) ของเซิร์ฟเวอร์ (หรือ SubjectAlternativeName);
  • $ldap_server[$serverId]['port']: พอร์ต TCP ที่เซิร์ฟเวอร์ LDAP รับฟังอยู่ โดยปกติคือ 389 สำหรับ LDAP และ LDAP+Start-TLS และ 636 สำหรับ LDAPs;
  • $ldap_server[$serverId]['protoversion']: ค่าที่เป็นไปได้คือ 'ldapv2' หรือ 'ldapv3' ขึ้นอยู่กับโปรโตคอลที่เซิร์ฟเวอร์ของคุณรองรับ โดย 'ldapv3' เป็นโปรโตคอลที่แนะนำ อย่างไรก็ตาม หากคุณต้องการใช้การเชื่อมต่อแบบเข้ารหัส โปรดทราบว่า LDAPs รองรับในโหมด 'ldapv2' ส่วน Start-TLS เป็นวิธีการเข้ารหัสสำหรับ 'ldapv3';
  • $ldap_server[$serverId]['encrypt']: กำหนดวิธีการเข้ารหัสที่ใช้ 'ldaps' รองรับสำหรับเซิร์ฟเวอร์ 'ldapv2' และ 'start-tls' สำหรับเซิร์ฟเวอร์ 'ldapv3' ส่วนคีย์เวิร์ด 'none' ใช้สำหรับการสื่อสาร LDAP แบบไม่เข้ารหัส;
    • อย่าลืมว่าสำหรับการเข้ารหัสแบบ 'ldaps' หรือ 'start-tls' เว็บเซิร์ฟเวอร์ต้องสามารถตรวจสอบใบรับรองของเซิร์ฟเวอร์ LDAP ได้ ดังนั้นคุณต้องกำหนด Certificate Authority ในไลบรารี openldap ของคุณ (โดยปกติทำในไฟล์ /etc/openldap/ldap.conf บน Linux)
  • $ldap_server[$serverId]['referrals']: เป็นพารามิเตอร์แบบบูลีนที่กำหนดว่าจะติดตาม referral หรือไม่ (ใช้ false สำหรับ ActiveDirectory);
  • $ldap_server[$serverId]['encoding']: เป็นพารามิเตอร์เสริมที่ระบุการเข้ารหัสอักขระที่ไดเรกทอรี LDAP ใช้จัดเก็บสตริง โดยปกติคุณไม่จำเป็นต้องตั้งค่าพารามิเตอร์นี้ เนื่องจากค่าเริ่มต้นที่สันนิษฐานคือ 'utf-8' ซึ่งเป็นการเข้ารหัสมาตรฐานของไดเรกทอรี LDAP อย่างไรก็ตาม หากคุณใช้ Active Directory และมีปัญหาในการนำเข้าสตริงที่มีเครื่องหมายกำกับเสียง ให้ลองตั้งค่าพารามิเตอร์นี้เป็นการเข้ารหัสที่ใช้ในพื้นที่ของคุณ (เช่น 'cp850' สำหรับยุโรปตะวันตก) คุณสามารถดูรายการการเข้ารหัสที่รองรับทั้งหมดได้จากรายการเลือกแบบดึงลง "กลุ่มลักษณะของไฟล์" ใน GUI นำเข้า Token จากไฟล์ CSV

ถัดไป คุณต้องกำหนดการยืนยันตัวตนที่จำเป็นสำหรับการเข้าถึงไดเรกทอรี หากอนุญาตให้เข้าถึงแบบ 'anonymous' อย่าตั้งค่าพารามิเตอร์สองตัวต่อไปนี้ มิฉะนั้นให้ตั้งค่าตามความเหมาะสม:

  • $ldap_server[$serverId]['binddn']: DN ของผู้ใช้ 'LDAP' ที่ได้รับอนุญาตให้อ่านไดเรกทอรี;
  • $ldap_server[$serverId]['bindpw']: รหัสผ่านของผู้ใช้ LDAP ข้างต้น

หากคุณต้องการกำหนดเซิร์ฟเวอร์ LDAP อื่นเพิ่มเติม ให้เพิ่มบรรทัดต่อไปนี้เพื่อเพิ่มค่า serverID และกำหนดพารามิเตอร์ใหม่:

  • $serverId++

การกำหนดคิวรีใน config/ldap.php

ข้อควรระวัง: เมื่อพารามิเตอร์เหล่านี้ต้องการ ชื่อแอตทริบิวต์ ldap ให้ใช้ชื่อที่เป็นตัวพิมพ์เล็กเท่านั้น เช่น displayname และไม่ใช่ displayName

โปรดดูไฟล์ config/ldap.php ซึ่งมีตัวอย่างการกำหนดค่าอยู่

คิวรีแบบง่าย

เริ่มต้นด้วยคิวรีแบบง่าย คิวรีเหล่านี้กรองรายการ LDAP โดยอิงจากแอตทริบิวต์และตำแหน่งของรายการนั้นเท่านั้น โดยปกติเพียงพอสำหรับการคิวรี ActiveDirectory

  • $query_id: คือ id ของคิวรี LDAP;
  • $ldap_queries[$query_id]['ldapServerId']: ผูกคิวรีกับเซิร์ฟเวอร์ที่ระบุ;
  • $ldap_queries[$query_id]['name']: สตริงที่อธิบายคิวรี ซึ่งจะแสดงใน GUI;
  • $ldap_queries[$query_id]['userbase']: Root DN ที่ใช้สำหรับการค้นหาผู้ใช้;
  • $ldap_queries[$query_id]['userfilter']: เป็นตัวกรองที่ใช้เลือกรายการผู้ใช้ที่อาจเข้าข่าย ต้องอยู่ในวงเล็บ;
  • $ldap_queries[$query_id]['userscope']: ขอบเขตของการค้นหา LDAP สำหรับผู้ใช้ ('base', 'one' หรือ 'sub');
  • $ldap_queries[$query_id]['firstname_attr']: แอตทริบิวต์ Ldap ที่จะถูกแมปกับฟิลด์ Firstname ของรายการ token;
  • $ldap_queries[$query_id]['lastname_attr']: แอตทริบิวต์ Ldap ที่จะถูกแมปกับฟิลด์ Lastname ของรายการ token;
  • $ldap_queries[$query_id]['email_attr']: แอตทริบิวต์ Ldap ที่จะถูกแมปกับฟิลด์ที่อยู่อีเมล์ของรายการ token

คุณสามารถดึงข้อมูลเพิ่มเติมจากไดเรกทอรีได้ตามต้องการ:

  • $ldap_queries[$query_id]['token_attr']: แอตทริบิวต์ Ldap ที่จะถูกแมปกับรหัส token;
  • $ldap_queries[$query_id]['language']: แอตทริบิวต์ Ldap ที่จะถูกแมปกับรหัสของภาษาของผู้ใช้;
  • $ldap_queries[$query_id]['attr1']: แอตทริบิวต์ Ldap ที่จะถูกแมปกับฟิลด์ attribute_1;
  • $ldap_queries[$query_id]['attr2']: แอตทริบิวต์ Ldap ที่จะถูกแมปกับฟิลด์ attribute_2

คิวรีกลุ่มแบบรวมที่มีสมาชิกเป็น DN

ต่อไปมาดูวิธีกำหนดคิวรีที่ซับซ้อนขึ้น

คิวรีต่อไปนี้ใช้การค้นหา LDAP ครั้งแรกที่ค้นหาในกลุ่ม LDAP กลุ่ม LDAP คือรายการ LDAP ที่มีการอ้างอิงถึงรายการผู้ใช้ในรูปแบบของ:

  • รหัสผู้ใช้ (user id) (เช่น posixGroups) ==> ดูในหัวข้อถัดไป
  • หรือ DN ของผู้ใช้ (เช่น groupofnames และ groupofuniquenames) ==> ดูด้านล่าง

ในส่วนนี้เราจะกล่าวถึงกลุ่มที่มี DN ของผู้ใช้:

  • กำหนด $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] ตามที่อธิบายไว้ข้างต้น

จากนั้นกำหนดพารามิเตอร์ตัวกรองกลุ่ม:

  • $ldap_queries[$query_id]['groupbase']: Root DN ที่คุณต้องการเริ่มค้นหารายการกลุ่ม;
  • $ldap_queries[$query_id]['groupfilter']: ตัวกรอง LDAP ที่จะเลือกรายการกลุ่มที่อาจเข้าข่าย;
  • $ldap_queries[$query_id]['groupscope']: ขอบเขตของการค้นหา LDAP สำหรับกลุ่ม ('one', 'base' หรือ 'sub');
  • $ldap_queries[$query_id]['groupmemberattr']: ชื่อของแอตทริบิวต์ LDAP ในรายการกลุ่มที่จะมีการอ้างอิงถึงรายการผู้ใช้;
  • $ldap_queries[$query_id]['groupmemberisdn']: TRUE

ณ จุดนี้ ทุกอย่างได้รับการตั้งค่าเรียบร้อยเพื่อให้การค้นหา LDAP ครั้งแรกพบผู้ใช้ที่ตรงกับกลุ่มที่เลือก อย่างไรก็ตาม คุณสามารถจำกัดว่า "ผู้ใช้ที่เข้าข่าย" รายใดจะถูกเลือกได้ โดยใช้ตัวกรองอีกชั้นกับผู้ใช้เหล่านั้น ซึ่งเป็นขั้นตอนที่ไม่บังคับ:

  • $ldap_queries[$query_id]['userbase']: Base DN สำหรับการค้นหา LDAP ของผู้ใช้ (จะเลือกเฉพาะผู้ใช้ที่เข้าข่ายและตรงกับ base นี้);
  • $ldap_queries[$query_id]['userscope']: ขอบเขตสำหรับการค้นหา LDAP ของผู้ใช้ (จะเลือกเฉพาะผู้ใช้ที่เข้าข่ายและตรงกับ userbase+scope);
  • $ldap_queries[$query_id]['userfilter']: เป็นตัวกรองที่ใช้กับรายการผู้ใช้ที่เข้าข่ายแต่ละราย (ตามแอตทริบิวต์) เพื่อเพิ่มเงื่อนไขการเลือกอีกชั้น

คิวรีกลุ่มแบบรวมที่มีสมาชิกเป็น UID

ต่อไปมาดูวิธีกำหนดคิวรีกลุ่มแบบรวมเมื่อสมาชิกในกลุ่มเป็น UID ของผู้ใช้ ไม่ใช่ DN ของผู้ใช้

เช่นเดียวกับคิวรีกลุ่มที่มีสมาชิกเป็น DN คิวรีเหล่านี้ใช้การค้นหา LDAP ครั้งแรกเพื่อหารายการกลุ่ม LDAP และดึงสมาชิกของกลุ่ม จากนั้นค่าของสมาชิกเหล่านี้จะถูกนำไปใช้ในตัวกรองการค้นหาผู้ใช้เพื่อค้นหารายการที่ตรงกัน ดังนั้นจึงต้องกำหนดค่าพารามิเตอร์อีกตัวหนึ่งเพื่อระบุแอตทริบิวต์ของผู้ใช้ในรายการผู้ใช้ที่ควรตรงกับ UID ของสมาชิกที่พบในกลุ่ม

มาทบทวนพารามิเตอร์ที่จำเป็น:

  • กำหนด $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] ตามที่อธิบายไว้ข้างต้น

จากนั้นกำหนดพารามิเตอร์ตัวกรองกลุ่ม:

  • $ldap_queries[$query_id]['groupbase']: Root DN ที่คุณต้องการเริ่มค้นหารายการกลุ่ม;
  • $ldap_queries[$query_id]['groupfilter']: ตัวกรอง LDAP ที่จะเลือกรายการกลุ่มที่อาจเข้าข่าย;
  • $ldap_queries[$query_id]['groupscope']: ขอบเขตของการค้นหา LDAP สำหรับกลุ่ม ('one', 'base' หรือ 'sub');
  • $ldap_queries[$query_id]['groupmemberattr']: ชื่อของแอตทริบิวต์ LDAP ในรายการกลุ่มที่จะมีการอ้างอิงถึงรายการผู้ใช้;
  • $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
  • $ldap_queries[$query_id]['useridattr']: ชื่อของแอตทริบิวต์ผู้ใช้ที่ต้องตรงกับ UID ที่พบในสมาชิกในกลุ่ม

ณ จุดนี้ ทุกอย่างได้รับการตั้งค่าเรียบร้อยเพื่อให้การค้นหา LDAP ครั้งแรกพบ UID ของผู้ใช้ที่ตรงกับกลุ่มที่เลือก และตัวกรองการค้นหาผู้ใช้จะถูกกรอกให้โดยอัตโนมัติ

อย่างไรก็ตาม คุณสามารถจำกัดว่า 'ผู้ใช้ที่เข้าข่าย' รายใดจะถูกเลือกได้ โดยเพิ่มเงื่อนไขให้กับตัวกรองผู้ใช้อัตโนมัติที่คำนวณจาก UID ของสมาชิก ซึ่งเป็นขั้นตอนที่ไม่บังคับ:

  • $ldap_queries[$query_id]['userbase']: Base DN สำหรับการค้นหา LDAP ของผู้ใช้ (จะเลือกเฉพาะผู้ใช้ที่เข้าข่ายและตรงกับ base นี้);
  • $ldap_queries[$query_id]['userscope']: ขอบเขตสำหรับการค้นหา LDAP ของผู้ใช้ (จะเลือกเฉพาะผู้ใช้ที่เข้าข่ายและตรงกับ userbase+scope);
  • $ldap_queries[$query_id]['userfilter']: เป็นตัวกรองที่ใช้กับรายการผู้ใช้ที่เข้าข่ายแต่ละราย (ตามแอตทริบิวต์) เพื่อเพิ่มเงื่อนไขการเลือกอีกชั้น

แล้ว Active Directory ล่ะ?

Active Directory (AD) คือรีจิสทรีของ Microsoft ที่สามารถสืบค้นได้โดยใช้โปรโตคอล LDAP

ดังนั้นจึงสามารถใช้เนื้อหาของ AD สำหรับการสืบค้นโทเคนของ LimeSurvey ได้ แต่ต้องมีความรู้ว่า AD ถูกจัดระเบียบอย่างไร

  • LDAP root base คือ dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1

==> ตัวอย่างเช่น หากบริษัทของคุณเป็นเจ้าของโดเมน DNS 'my-company.com' และโดเมน Windows ของคุณคือ 'employees' root base ของคุณจะเป็น dc=employees,dc=my-company,dc=com

  • ผู้ใช้และกลุ่มผู้ใช้ถูกจัดเก็บไว้ภายใต้ cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (โปรดทราบว่าไม่ใช่ ou=users);
  • กลุ่มของ Active Directory:
    • ออบเจ็กต์ของกลุ่มจะเก็บ DN ของสมาชิกไว้ในแอตทริบิวต์ 'member';
    • การเป็นสมาชิกกลุ่มยังถูกจัดเก็บไว้ในแอตทริบิวต์ memberOf ของแต่ละรายการผู้ใช้ด้วย แอตทริบิวต์นี้เก็บ DN ของกลุ่มที่ผู้ใช้เป็นสมาชิกอยู่;
    • บางกลุ่มอยู่ใน CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
      • ตัวอย่างเช่น: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;

ในบางกรณี การสืบค้น Active Directory ไม่ใช่เรื่องง่าย ด้านล่างนี้จึงเป็นตัวอย่างการกำหนดค่าสำหรับดึงข้อมูลบางอย่างจาก Active Directory:

//Connection to the active directory Server:
$serverId=0;
$ldap_server[$serverId]['server'] = "10.10.10.10";
$ldap_server[$serverId]['port'] = "389";
$ldap_server[$serverId]['protoversion'] = "ldapv2";
$ldap_server[$serverId]['encrypt'] = "none"; // Most AD LDAP servers will not have encryption set by default
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user";
$ldap_server[$serverId]['bindpw'] = "userpassword";
//$ldap_server[$serverId]['binddn'] = "CN=user,OU=user_group,DC=xxx,DC=yyy"; this one will not work with active directory, that´s why you need to use "domain\\user"
//Here is a sample query for getting all active users of an active directory:
$query_id=0;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Staff with an enabled account';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
//AD has no "account is enabled" attribute, so the filter excludes accounts that have the "disabled" flag (bit 2) set in userAccountControl
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
//You can also filter on group membership through the memberOf attribute of the user. Here is a sample query for getting all active users that are member of the group "samplegroup" in active directory:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'All members of samplegroup';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(memberOf=CN=samplegroup,OU=Group Global,OU=USER_GROUP,DC=xxx,DC=yyy)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';

ตัวอย่างการสืบค้นผู้ใช้อีกตัวอย่างหนึ่ง:

$ldap_queries[$query_id]['userfilter'] = '(&(objectCategory=Person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; // AD doesn't recognise enabled accounts in the normal way, so instead, we check users are not disabled
  • ลองพิจารณาเพิ่ม (mail=*) ในตัวกรองผู้ใช้ของคุณ เพื่อข้ามผู้ใช้ที่ไม่มีที่อยู่อีเมล

ตัวอย่างการสืบค้นกลุ่ม:

$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass=group)(cn=Domain Admins))'; // AD doesn't use the standard attribute name for groups, so use this example instead.

การสร้างการสืบค้นหนึ่งรายการต่อหนึ่งกลุ่มของ Active Directory โดยอัตโนมัติ

หากคุณเก็บกลุ่มของผู้เข้าร่วมแบบสำรวจไว้ใน organizational unit (OU) เดียว คุณไม่จำเป็นต้องเขียนการสืบค้นสำหรับแต่ละกลุ่ม โค้ดต่อไปนี้จะแสดงรายการกลุ่มทั้งหมดใน OU นั้นและสร้างการสืบค้นหนึ่งรายการต่อหนึ่งกลุ่ม การสืบค้นจะรวมสมาชิกที่เปิดใช้งานทั้งหมดของกลุ่ม รวมถึงสมาชิกของกลุ่มที่ซ้อนอยู่ด้วย

เพิ่มโค้ดลงใน config/ldap.php หลังจากส่วนกำหนดเซิร์ฟเวอร์และการสืบค้นของคุณ และก่อนบรรทัด //DO NOT CHANGE BELOW HERE จากนั้นกำหนดค่าตัวแปรทั้งสี่ตัวที่ด้านบน:

  • $groupServerId: ค่า $serverId ของเซิร์ฟเวอร์ที่ต้องการใช้;
  • $groupContainer: DN ของ OU ที่เก็บกลุ่ม ระบบจะแสดงรายการเฉพาะกลุ่มที่อยู่ใน OU นี้โดยตรง ไม่รวมกลุ่มใน OU ย่อย;
  • $groupUserBase: root DN ที่ใช้ค้นหาสมาชิกของกลุ่ม;
  • $groupNameAttr: แอตทริบิวต์ของกลุ่ม (ตัวพิมพ์เล็ก) ที่ใช้เป็นชื่อการสืบค้นใน GUI เช่น 'info' (ช่อง "Notes" ใน "Active Directory Users and Computers") หรือ 'description' หากกลุ่มไม่มีค่าในแอตทริบิวต์นี้ ระบบจะใช้ cn ของกลุ่มแทน
$groupServerId  = 0;
$groupContainer = 'OU=Survey groups,DC=xxx,DC=yyy';
$groupUserBase  = 'DC=xxx,DC=yyy';
$groupNameAttr  = 'info';

$srv = $ldap_server[$groupServerId];
$ds = ldap_connect(($srv['encrypt'] == 'ldaps' ? 'ldaps://' : 'ldap://') . $srv['server'] . ':' . $srv['port']);
if ($ds) {
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $srv['protoversion'] == 'ldapv3' ? 3 : 2);
    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
    // Never send the bind password if Start-TLS was requested but failed
    $secure = $srv['encrypt'] != 'start-tls' || @ldap_start_tls($ds);
    $bound = $secure && (empty($srv['binddn']) ? @ldap_bind($ds) : @ldap_bind($ds, $srv['binddn'], $srv['bindpw']));
    $result = $bound ? @ldap_list($ds, $groupContainer, '(objectCategory=group)', array('cn', $groupNameAttr)) : false;
    $groups = $result ? ldap_get_entries($ds, $result) : array('count' => 0);
    for ($i = 0; $i < $groups['count']; $i++) {
        $query_id++;
        $ldap_queries[$query_id]['ldapServerId'] = $groupServerId;
        $ldap_queries[$query_id]['name'] = isset($groups[$i][$groupNameAttr][0]) ? $groups[$i][$groupNameAttr][0] : $groups[$i]['cn'][0];
        $ldap_queries[$query_id]['userbase'] = $groupUserBase;
        // Enabled users with an email address that are members of the group, directly or through nested groups
        $ldap_queries[$query_id]['userfilter'] = '(&(objectCategory=person)(objectClass=user)(mail=*)'
            . '(!(userAccountControl:1.2.840.113556.1.4.803:=2))'
            . '(memberOf:1.2.840.113556.1.4.1941:=' . ldap_escape($groups[$i]['dn'], '', LDAP_ESCAPE_FILTER) . '))';
        $ldap_queries[$query_id]['userscope'] = 'sub';
        $ldap_queries[$query_id]['firstname_attr'] = 'givenname';
        $ldap_queries[$query_id]['lastname_attr'] = 'sn';
        $ldap_queries[$query_id]['email_attr'] = 'mail';
        $ldap_queries[$query_id]['token_attr'] = '';
        $ldap_queries[$query_id]['language'] = '';
        $ldap_queries[$query_id]['attr1'] = '';
        $ldap_queries[$query_id]['attr2'] = '';
    }
    ldap_unbind($ds);
}

สิ่งที่ควรทราบ:

  • โค้ดจะเชื่อมต่อกับไดเรกทอรีทุกครั้งที่หน้า "นำเข้าผู้เข้าร่วมประชุมจาก LDAP" ถูกเปิดหรือส่งข้อมูล ดังนั้นกลุ่มใหม่จะปรากฏขึ้นโดยไม่ต้องเปลี่ยนการกำหนดค่า หากการเชื่อมต่อหรือการ bind ล้มเหลว หน้านี้จะแสดงเฉพาะการสืบค้นที่คุณกำหนดเองด้วยมือเท่านั้น
  • กฎการจับคู่ 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) ใช้แก้ไขกลุ่มที่ซ้อนกัน กฎนี้มีเฉพาะใน Active Directory ดังนั้นตัวอย่างนี้จึงใช้ไม่ได้กับเซิร์ฟเวอร์ LDAP อื่น สำหรับเซิร์ฟเวอร์เหล่านั้น ให้ใช้ การสืบค้นกลุ่มแบบรวม สำหรับแต่ละกลุ่มแทน
  • หากต้องการแสดงรายการกลุ่มใน OU ย่อยของ $groupContainer ด้วย ให้แทนที่ ldap_list ด้วย ldap_search
  • หากต้องการแสดงรายการกลุ่มจากหลาย OU ให้ทำซ้ำโค้ดโดยใช้ค่าอื่นสำหรับตัวแปรทั้งสี่ตัว

ดูข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้าง LDAP ของ Active Directory ได้ที่ Active Directory Architecture และ Active Directory Technical Specification