การตั้งค่า LDAP
From LimeSurvey Manual
ทั่วไป
คุณต้องเปิดใช้งานการรองรับ LDAP ใน config.php และกำหนดค่าพารามิเตอร์ LDAP ใน config/ldap.php เพื่อให้สามารถใช้งานฟังก์ชันนี้ได้
การเปิดใช้งาน 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