การใช้ส่วนขยาย OpenLDAP ของ PHP ใน ServBay
ServBay คือสภาพแวดล้อมการพัฒนา Web ในเครื่องที่ทรงพลัง รองรับเทคโนโลยีหลากหลาย สำหรับนักพัฒนา PHP ที่ต้องการเชื่อมต่อและทำงานกับเซิร์ฟเวอร์ LDAP (Lightweight Directory Access Protocol) ServBay ได้ติดตั้งส่วนขยาย OpenLDAP สำหรับ PHP มาให้ล่วงหน้า พร้อมให้เปิดใช้งานและเริ่มต้นได้ง่าย คู่มือนี้จะแนะนำขั้นตอนการใช้งานส่วนขยายนี้บน ServBay เพื่อรองรับฟังก์ชันการตรวจสอบตัวตนผู้ใช้ ค้นหาข้อมูลในไดเรกทอรี และอื่น ๆ
OpenLDAP และ OpenLDAP extension ของ PHP คืออะไร?
OpenLDAP เป็นซอฟต์แวร์ open-source ยอดนิยมสำหรับให้บริการไดเรกทอรีตามมาตรฐาน LDAP ใช้กันอย่างแพร่หลายในองค์กรสำหรับการยืนยันตัวตนผู้ใช้ การบริหารโครงสร้างองค์กร หรือสมุดรายชื่อ
OpenLDAP extension ของ PHP (มักจะเรียกสั้น ๆ ว่า ldap
extension) คือโมดูลของ PHP ที่เสริมชุดฟังก์ชันสำหรับสื่อสารกับเซิร์ฟเวอร์ LDAP โดยตรง ด้วยส่วนขยายนี้ คุณจึงสามารถเชื่อมต่อ LDAP server จากโค้ด PHP ของคุณ เพื่อสืบค้น (bind), ค้นหาข้อมูล (search), เพิ่ม, แก้ไข, หรือลบรายการในไดเรกทอรีได้อย่างยืดหยุ่น
สำหรับใน ServBay เราให้ความสำคัญกับ OpenLDAP client extension ของ PHP ซึ่งเชื่อมต่อและจัดการเซิร์ฟเวอร์ LDAP ภายนอก (ServBay ไม่ได้ติดตั้ง LDAP server ภายในตัว)
ฟีเจอร์หลักของ PHP OpenLDAP extension
คุณสามารถทำสิ่งต่าง ๆ เหล่านี้ด้วย PHP OpenLDAP extension:
- เชื่อมต่อกับเซิร์ฟเวอร์ LDAP: สร้างการเชื่อมต่อกับ LDAP server ที่ระบุ
- ดำเนินการ bind: ผูกการเชื่อมต่อ LDAP แบบนิรนาม หรือโดยใช้ DN (Distinguished Name) และรหัสผ่าน
- ค้นหารายการในไดเรกทอรี: สืบค้นข้อมูลโดยใช้ filter, ฐานการค้นหา และระดับของ search
- อ่านข้อมูลแอตทริบิวต์: เข้าถึงผลลัพธ์และข้อมูลภายในรายการต่าง ๆ ที่คืนค่ามา
- แก้ไข/จัดการ directory: เพิ่ม, ลบ, และเปลี่ยนแปลงแอตทริบิวต์หรือล็อตข้อมูลในไดเรกทอรี
- จัดการข้อผิดพลาด LDAP: ดึงข้อมูลรายละเอียดเมื่อเกิดข้อผิดพลาด
ความเข้ากันได้ของ PHP OpenLDAP extension ใน ServBay
ServBay รองรับการติดตั้งและสลับใช้หลายเวอร์ชันของ PHP ส่วนขยาย OpenLDAP มักถูกรวมมาในตัว PHP ที่เผยแพร่อย่างเป็นทางการ และรวมไว้กับ PHP packages บน ServBay ตามค่าเริ่มต้น หมายความว่า PHP ใน ServBay เกือบทั้งหมดจะเปิดใช้งาน OpenLDAP extension พร้อมใช้งานเสมอ
วิธีตรวจสอบว่าส่วนขยาย OpenLDAP ของ PHP เปิดใช้งานอยู่หรือไม่
แม้ ServBay จะตั้งค่าให้พร้อมใช้งานส่วนขยายยอดนิยมเหล่านี้เป็นค่าเริ่มต้นอยู่แล้ว แต่การตรวจสอบสถานะก็ยังเป็นแนวปฏิบัติที่ดี วิธีที่ง่ายและรวดเร็วที่สุดคือใช้ฟังก์ชัน phpinfo()
ที่โฟลเดอร์รากของเว็บไซต์บน ServBay (ค่าเริ่มต้นคือ
/Applications/ServBay/www
) สร้างไฟล์ PHP ใหม่ขึ้นมา เช่นinfo.php
เติมเนื้อหาต่อไปนี้ในไฟล์
info.php
ของคุณ:php<?php phpinfo(); ?>
1
2
3เปิดเว็บเบราว์เซอร์และเข้าชม URL ที่เกี่ยวข้องกับไฟล์นี้ใน ServBay เช่น
http://servbay.demo/info.php
ค้นหาหน้าข้อมูล phpinfo() แล้วหา section ที่ชื่อ
ldap
ถ้าปรากฏ section
ldap
พร้อมข้อความแสดงการเปิดใช้งาน (เช่นLDAP Support enabled
) แปลว่าส่วนขยาย OpenLDAP ถูกโหลดและเปิดใช้งานอย่างถูกต้องแล้ว
หากไม่พบส่วน ldap
หรือค่า LDAP Support
เป็น disabled ให้ตรวจสอบการตั้งค่า build ของ PHP version นั้น ๆ ใน ServBay หรืออาจติดต่อฝ่ายสนับสนุนของ ServBay (แต่ส่วนใหญ่แล้วฟีเจอร์นี้เปิดใช้งานตลอด)
การใช้ OpenLDAP ใน PHP code
หากยืนยันแล้วว่าส่วนขยาย OpenLDAP เปิดใช้งาน คุณก็เริ่มใช้งานฟังก์ชันกลุ่ม ldap_*
ในโค้ด PHP เพื่อเชื่อมต่อกับ LDAP server ได้ทันที ด้านล่างคือตัวอย่างพื้นฐานตั้งแต่การเชื่อมต่อเซิร์ฟเวอร์, bind ด้วย admin, ค้นหาผู้ใช้ และพยายามตรวจสอบรหัสผ่านผู้ใช้
คำเตือน: ค่า configuration ต่าง ๆ ในตัวอย่าง (เช่น server address, DN, password, search base, filter, รหัสผ่านผู้ใช้ ฯลฯ) เป็น ตัวอย่างสมมติ กรุณาแทนที่ด้วยข้อมูลของเซิร์ฟเวอร์ LDAP จริงของคุณเอง และอย่านำข้อมูลสำคัญอย่างรหัสผ่านไป hardcode ไว้ใน production!
ตัวอย่างโค้ด: การเชื่อมต่อ, ค้นหา, และตรวจสอบตัวตนพื้นฐาน
บันทึกตัวอย่างโค้ดต่อไปนี้เป็นไฟล์ PHP (เช่น ldap_test.php
) ในโฟลเดอร์เว็บไซต์ของคุณ แล้วเข้าผ่านเบราว์เซอร์
php
<?php
// --- LDAP 连接配置 ---
// 替换为您的 LDAP 服务器地址。如果使用 LDAPS (SSL/TLS),则使用 ldaps:// 前缀,默认端口 636。
$ldapURI = "ldap://ldap.example.com:389";
// 替换为您的 LDAP 管理员或具有搜索权限的用户的 DN (Distinguished Name)
$ldapAdminRdn = "cn=admin,dc=example,dc=com";
// 替换为上述管理员 DN 对应的密码
$ldapAdminPassword = "admin_password";
// --- 用户搜索与认证配置 ---
// 替换为您的 LDAP 目录中用户所在的搜索基准 DN
$searchBase = "dc=example,dc=com";
// 替换为用于搜索特定用户的过滤器。例如,搜索 uid 为 'servbay-demo' 的用户。
$searchFilter = "(uid=servbay-demo)";
// 替换为您要认证的用户的密码
$userPasswordToAuthenticate = "user_password_for_servbay_demo";
echo "<h2>ตัวอย่าง OpenLDAP ของ PHP บน ServBay</h2>";
// 1. 连接 LDAP 服务器
echo "<p>กำลังเชื่อมต่อกับ LDAP server: {$ldapURI}...</p>";
$ldapConn = ldap_connect($ldapURI);
if (!$ldapConn) {
die("<p style='color: red;'>ข้อผิดพลาด: ไม่สามารถเชื่อมต่อกับ LDAP server ได้</p>");
}
echo "<p style='color: green;'>เชื่อมต่อ LDAP server สำเร็จ</p>";
// 设置 LDAP 选项(通常建议设置协议版本和不跟随 referrals)
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
// 2. 使用管理员凭据绑定到 LDAP 服务器(用于搜索等需要权限的操作)
echo "<p>กำลัง bind ด้วย Admin DN '{$ldapAdminRdn}'...</p>";
if (!ldap_bind($ldapConn, $ldapAdminRdn, $ldapAdminPassword)) {
echo "<p style='color: red;'>ข้อผิดพลาด: bind ด้วย admin ล้มเหลว</p>";
echo "<p style='color: red;'>LDAP error: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // ปิดการเชื่อมต่อ
die();
}
echo "<p style='color: green;'>bind ด้วย admin สำเร็จ</p>";
// 3. 搜索用户
echo "<p>กำลังค้นหา filter '{$searchFilter}' ที่ search base '{$searchBase}'...</p>";
$searchResult = ldap_search($ldapConn, $searchBase, $searchFilter);
if (!$searchResult) {
echo "<p style='color: red;'>ข้อผิดพลาด: การค้นหา LDAP ล้มเหลว</p>";
echo "<p style='color: red;'>LDAP error: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // ปิดการเชื่อมต่อ
die();
}
echo "<p style='color: green;'>ค้นหาสำเร็จ</p>";
// 4. 获取搜索结果
$entries = ldap_get_entries($ldapConn, $searchResult);
if ($entries["count"] > 0) {
echo "<p>พบ {$entries["count"]} รายการ</p>";
// 假设我们只关心第一个匹配的用户
$userDn = $entries[0]["dn"];
echo "<p>User DN รายการแรก: <strong>{$userDn}</strong></p>";
// 5. 尝试使用找到的用户 DN 和用户密码进行认证绑定
echo "<p>กำลัง bind โดยใช้ User DN '{$userDn}'...</p>";
// 注意:这里进行的是用户的认证绑定,而不是管理员绑定
if (@ldap_bind($ldapConn, $userDn, $userPasswordToAuthenticate)) {
echo "<p style='color: green;'>ผู้ใช้ตรวจสอบตัวตนได้สำเร็จ!</p>";
} else {
echo "<p style='color: red;'>การตรวจสอบตัวตนผู้ใช้ล้มเหลว</p>";
echo "<p style='color: red;'>LDAP error: " . ldap_error($ldapConn) . "</p>";
}
} else {
echo "<p>ไม่พบผู้ใช้ตาม filter '{$searchFilter}'</p>";
}
// 6. 关闭 LDAP 连接
echo "<p>ปิดการเชื่อมต่อ LDAP...</p>";
ldap_unbind($ldapConn);
echo "<p style='color: green;'>ปิดการเชื่อมต่อเสร็จสิ้น</p>";
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
อธิบายโค้ด
- เชื่อมต่อ (
ldap_connect
): สร้างการเชื่อมต่อกับ LDAP server คืนค่าตัวแปรอ้างอิงที่ใช้กับฟังก์ชันอื่น ๆ ต่อไป - ตั้งค่า (
ldap_set_option
): ตั้งการใช้ protocol version 3 (แนะนำ) และปิด referrals ซึ่งมักไม่จำเป็นในแอปฯ พื้นฐาน - bind (
ldap_bind
): รับรองตัวตนกับ LDAP; มีทั้งแบบ anonymous (ไม่ใช้ DN/รหัสผ่าน) และแบบ authen (ระบุ DN/รหัสผ่าน) — ตัวอย่างนี้ bind ด้วย admin ก่อนแล้วต่อมา bind ด้วย user ที่ค้นพบ - ค้นหา (
ldap_search
): สืบค้นข้อมูล user ตาม filter ที่ระบุจาก base DN ที่กำหนด - ดึงรายการ (
ldap_get_entries
): นำข้อมูลผลลัพธ์ออกมาเป็น array - ปิดการเชื่อมต่อ (
ldap_unbind
): ยุติการเชื่อมต่อและเคลียร์ resource
ข้อควรระวัง
- เซิร์ฟเวอร์ LDAP: คู่มือนี้เน้นการใช้ client extension เท่านั้น คุณจะต้องมี LDAP server ที่เปิดใช้งาน (ติดตั้งแยก มีทั้ง OpenLDAP ในเครื่องหรือ enterprise LDAP/Active Directory ก็ได้)
- ความปลอดภัย: สำหรับ production ควรจัดการ config และรหัสผ่านอย่างปลอดภัย เช่น ซ่อนไว้ใน environment variable, ไฟล์ config ที่ถูกป้องกัน หรือเชื่อมต่อผ่าน LDAPS (SSL/TLS บนพอร์ต 636) แทน LDAP ปกติที่ไม่เข้ารหัส (พอร์ต 389)
- การจัดการข้อผิดพลาด: ตัวอย่างนี้จับข้อผิดพลาดแบบพื้นฐาน ในงานจริงควรมีระบบ log และ error handling ที่ครบถ้วนกว่านี้
- รูปแบบ DN: Distinguished Name (DN) มี format เฉพาะและต้องตรงกับการตั้งค่า LDAP server ของคุณ
คำถามที่พบบ่อย (FAQ)
ถาม: ทำไมใน phpinfo()
ไม่เห็น section ldap
หรือขึ้นว่า disabled?
ตอบ: ใน ServBay ส่วนขยายนี้มักเปิดใช้งานเป็นค่าเริ่มต้น ให้แน่ใจว่าคุณดูผลลัพธ์ของ PHP version ที่ใช้งานจริง หากยังไม่พบ กรณีพบปัญหาอาจลองติดตั้ง ServBay หรือ package PHP ใหม่ หรือขอคำปรึกษาจากทีมซัพพอร์ต
ถาม: PHP แจ้ง error Call to undefined function ldap_connect()
?
ตอบ: หมายถึง PHP ยังไม่ได้โหลด OpenLDAP extension ให้ทบทวนขั้นตอนตรวจสอบด้วย phpinfo()
อีกครั้ง
ถาม: ส่วนขยายเปิดใช้งานแล้วแต่เชื่อมต่อหรือ bind ไม่ผ่าน แจ้ง LDAP error?
ตอบ: ตรวจสอบความถูกต้องของ config ได้แก่ server address, port, DN และ password เพื่อแน่ใจว่าข้อมูลถูกต้อง และสามารถเชื่อมต่อถึงเซิร์ฟเวอร์ได้ ใช้ฟังก์ชัน ldap_error()
เพื่อดูข้อความ error โดยละเอียด เช่น “Invalid credentials” หรือ “Can't contact LDAP server” เป็นต้น ตรวจสอบว่า LDAP server เปิดใช้งานและเครือข่ายเชื่อมต่อได้
สรุป
ServBay มอบวิธีที่ง่ายในการใช้งานส่วนขยาย OpenLDAP ของ PHP เพียงไม่กี่ขั้นตอน คุณสามารถตรวจสอบและใช้งานความสามารถของ PHP กับ LDAP server ได้เต็มที่ ด้วยชุดฟังก์ชัน LDAP ที่ทรงพลังของ PHP นักพัฒนาสามารถเพิ่มฟีเจอร์การตรวจสอบตัวตนผู้ใช้ ค้นหาข้อมูล เข้า directory ฯลฯ ในแอปพลิเคชัน Web พื้นฐานของตนได้อย่างยืดหยุ่น ขยายขอบเขตการใช้งานได้อีกมากในทุกโอกาส