استخدام امتداد OpenLDAP لـ PHP في ServBay
يُعد ServBay بيئة تطوير ويب محلية قوية تدعم العديد من التقنيات. لمطوري تطبيقات PHP الذين يحتاجون إلى التفاعل مع خادم LDAP (بروتوكول الوصول الخفيف إلى الدليل)، يُوفر ServBay امتداد OpenLDAP لـ PHP مُثبت مسبقًا، ما يتيح تفعيله واستخدامه بسهولة. ستُرشدك هذه المقالة إلى كيفية الاستفادة من هذا الامتداد ضمن بيئة ServBay لتنفيذ وظائف مثل مصادقة المستخدمين، واستعلامات الدليل، وغيرها.
ما هو OpenLDAP وما هو امتداد OpenLDAP لـ PHP؟
OpenLDAP هو تطبيق مفتوح المصدر شهير يقدم إمكانيات خدمة الدليل وفق بروتوكول LDAP. يُستخدم LDAP كبرتوكول للوصول إلى خدمات معلومات الدليل الموزعة والحفاظ عليها، ويُستخدم على نطاق واسع في المؤسسات لمهام مثل مصادقة المستخدمين، إدارة الهيكل التنظيمي، وخدمات دفتر العناوين.
امتداد OpenLDAP لـ PHP (يُعرف غالبًا بامتداد ldap
) هو وحدة في لغة PHP تُوفر مكتبة دوال للتواصل مع خوادم LDAP. من خلال هذا الامتداد، يمكن لتطبيقات PHP الاتصال بخادم LDAP وتنفيذ عمليات مثل الربط (المصادقة)، البحث، الإضافة، التعديل، أو حذف بيانات الدليل.
في ServBay، نهتم بشكل رئيسي بامتداد العميل الخاص بـ OpenLDAP المدمج في PHP، والذي يسمح لكود PHP الخاص بك بالاتصال والتعامل مع خوادم LDAP خارجية. لاحظ أن ServBay نفسه لا يتضمن خادم OpenLDAP.
الميزات الأساسية لامتداد OpenLDAP في PHP
يوفر لك امتداد OpenLDAP في PHP ما يلي:
- الاتصال بخادم LDAP: إنشاء اتصال مع خادم LDAP المحدد.
- تنفيذ عمليات الربط (المصادقة): إما ربط مجهول أو باستخدام DN (اسم مميز) وكلمة مرور.
- البحث في الدليل: استعلام إدخالات الدليل باستخدام عوامل التصفية وقواعد وقيود البحث.
- قراءة بيانات الإدخالات: جلب سمات وقيم لكل إدخال نتيجة البحث.
- تنفيذ العمليات التعديلية: إضافة إدخالات جديدة، حذف إدخالات، أو تعديل سمات الإدخالات.
- معالجة أخطاء LDAP: الحصول على معلومات حول الخطأ عند فشل العمليات.
توافق إصدارات امتداد OpenLDAP لـ PHP ضمن ServBay
يدعم ServBay تثبيت وتشغيل عدة إصدارات من PHP. ويمثل امتداد OpenLDAP جزءًا من حزمة PHP الرسمية، ويأتي مدمجًا افتراضيًا في حزم PHP التي يوفرها ServBay. وهذا يعني غالبًا أن الامتداد متاح للاستخدام مباشرة عند استخدام إصدارات PHP التي يوفرها ServBay.
كيفية التحقق من تفعيل امتداد OpenLDAP في PHP
رُغم تصميم ServBay ليكون جاهزًا للاستخدام من اللحظة الأولى مع تفعيل معظم الامتدادات الشائعة افتراضيًا، يُعد التحقق من الحالة أمرًا جيدًا دائمًا. أبسط طريقة هي استخدام دالة phpinfo()
.
قُم بإنشاء ملف PHP جديد في جذر موقعك ضمن ServBay (المسار الافتراضي:
/Applications/ServBay/www
)، وليكن باسمinfo.php
.أضف الكود التالي إلى ملف
info.php
:php<?php phpinfo(); ?>
1
2
3افتح متصفح الويب وادخل إلى رابط ملف الموقع الذي أنشأته (مثلاً:
http://servbay.demo/info.php
).في صفحة
phpinfo()
التي تظهر، ابحث عن قسم يحمل اسمldap
.إذا وجدت قسم
ldap
وفيه معلومات مثلLDAP Support enabled
، فهذا يعني أن امتداد OpenLDAP في PHP تم تفعيله بنجاح.
إذا لم تجد قسم ldap
أو ظهرت رسالة بأن دعم LDAP "معطل"، قد تحتاج لمراجعة إعدادات بناء PHP ضمن ServBay أو التواصل مع الدعم الفني. لكن في أغلب الحالات، يكون الامتداد مفعلاً افتراضيًا.
استخدام OpenLDAP في كود PHP الخاص بك
بعد التأكد من تفعيل الامتداد، يمكنك الآن استخدام دوال السلسلة ldap_*
في تطبيق PHP الخاص بك للتفاعل مع خادم LDAP. المثال التالي يُوضح الطريقة الأساسية للاتصال بخادم LDAP، ربط (مصادقة) المشرف، البحث عن مستخدم، ومحاولة المصادقة للمستخدم.
ملاحظة هامة: جميع عناوين خوادم LDAP، الأرقام، DN الإداري، كلمة المرور، قاعدة البحث، عوامل التصفية، وكلمات المرور في الكود أدناه هي قيم وهمية لأغراض المثال فقط. يُرجى استبدالها بالإعدادات الحقيقية الخاصة بك. لا تقم أبدًا بتخزين معلومات حساسة مثل كلمات المرور بشكل صريح في الكود ضمن بيئة الإنتاج.
مثال عملي: الاتصال، البحث، والمصادقة
احفظ الكود التالي كملف PHP (مثلاً: ldap_test.php
) ضمن موقعك في ServBay، ثم شغله عبر المتصفح.
<?php
// --- إعدادات اتصال LDAP ---
// استبدل بعنوان خادم LDAP الخاص بك. إذا كنت تستخدم LDAPS (SSL/TLS)، استعمل ldaps:// والبورت 636 افتراضيًا.
$ldapURI = "ldap://ldap.example.com:389";
// استبدل بDN المسؤول أو المستخدم المصرح له بالبحث
$ldapAdminRdn = "cn=admin,dc=example,dc=com";
// استبدل بكلمة مرور DN الإداري أعلاه
$ldapAdminPassword = "admin_password";
// --- إعدادات البحث والمصادقة ---
// استبدل بقاعدة البحث لمستخدميك في LDAP
$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: {$ldapURI}...</p>";
$ldapConn = ldap_connect($ldapURI);
if (!$ldapConn) {
die("<p style='color: red;'>خطأ: تعذر الاتصال بخادم LDAP.</p>");
}
echo "<p style='color: green;'>تم الاتصال بنجاح بخادم LDAP.</p>";
// إعداد خيارات LDAP (ينصح عادةً بضبط إصدار البروتوكول وعدم تتبع التحويلات)
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
// 2. ربط (مصادقة) بخادم LDAP كمسؤول (لعمليات مثل البحث)
echo "<p>محاولة الربط باسم المسؤول '{$ldapAdminRdn}' ...</p>";
if (!ldap_bind($ldapConn, $ldapAdminRdn, $ldapAdminPassword)) {
echo "<p style='color: red;'>خطأ: فشل ربط المسؤول.</p>";
echo "<p style='color: red;'>خطأ LDAP: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // إغلاق الاتصال
die();
}
echo "<p style='color: green;'>تم ربط المسؤول بنجاح.</p>";
// 3. البحث عن المستخدم
echo "<p>محاولة البحث بمعيار DN '{$searchBase}' وعامل تصفية '{$searchFilter}' ...</p>";
$searchResult = ldap_search($ldapConn, $searchBase, $searchFilter);
if (!$searchResult) {
echo "<p style='color: red;'>خطأ: فشل البحث في LDAP.</p>";
echo "<p style='color: red;'>خطأ LDAP: " . 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>DN أول مستخدم مطابق: <strong>{$userDn}</strong></p>";
// 5. محاولة الربط (المصادقة) باستخدام DN المستخدم وكلمة المرور
echo "<p>محاولة الربط باسم المستخدم '{$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: " . ldap_error($ldapConn) . "</p>";
}
} else {
echo "<p>لم يتم العثور على مستخدم يطابق عامل التصفية '{$searchFilter}'.</p>";
}
// 6. إغلاق اتصال LDAP
echo "<p>إغلاق اتصال LDAP ...</p>";
ldap_unbind($ldapConn);
echo "<p style='color: green;'>تم إغلاق الاتصال.</p>";
?>
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 ويعيد معرف الاتصال. - إعداد الخيارات (
ldap_set_option
): لتعديل سلوك الاتصال. الخيارLDAP_OPT_PROTOCOL_VERSION, 3
لاستخدام بروتوكول LDAPv3 (موصى به)، وLDAP_OPT_REFERRALS, 0
لتعطيل التحويلات. - الربط (
ldap_bind
): مصادقة ضد خادم LDAP.- الربط المجهول:
ldap_bind($ldapConn)
– بدون DN أو كلمة مرور، يقتصر عادةً على صلاحيات قليلة. - الربط المُصادق:
ldap_bind($ldapConn, $dn, $password)
– يستخدم DN وكلمة سر محددين. في المثال، نربط أولاً كمسؤول بغرض البحث ثم كمستخدم بغرض المصادقة.
- الربط المجهول:
- البحث (
ldap_search
): يبحث عن إدخالات ضمن قاعدة بحث DN وفق عامل التصفية. - جلب النتائج (
ldap_get_entries
): يستخلص جميع الإدخالات المطابقة كصفيف يحتوي على بيانات الدليل. - إغلاق الاتصال (
ldap_unbind
): يغلق الاتصال بالخادم وحرر الموارد.
نصائح وإرشادات
- وجود خادم LDAP: هذه الوثيقة والمثال تشرح استخدام امتداد OpenLDAP العميل في PHP فقط. تحتاج لتوفر خادم LDAP فعّال سواء محليًا أو عن بُعد (مثل Active Directory).
- الأمان: في بيئة الإنتاج، اتبع أفضل ممارسات الأمان: استخدم متغيرات البيئة أو ملفات إعداد آمنة، واعتمد اتصال LDAPS المُشفر (عادةً عبر المنفذ 636) بدلاً من LDAP غير المُشفر (389).
- معالجة الأخطاء: يتضمن المثال معالجة أخطاء بسيطة فقط، يُنصح في التطبيقات الحقيقية بآليات أقوى للتعامل مع الأخطاء وتسجيلها.
- تنسيق DN: يجب أن يكون DN (Distinguished Name) بالتنسيق الصحيح تمامًا بحسب إعدادات خادم LDAP لديك.
الأسئلة الشائعة (FAQ)
س: لمَ لا أرى قسم ldap
في نتيجة phpinfo()
أو ظهر أنه مُعطل؟
ج: عادةً ما يكون الامتداد مفعلاً تلقائيًا في ServBay. تأكد أنك تستخدم النسخة الصحيحة من PHP عند معاينة نتائج phpinfo()
. إذا لم يظهر القسم، ربما هناك مشكلة في إصدار ServBay لديك أو طريقة التثبيت، فحاول إعادة تثبيت حزمة PHP أو تواصل مع الدعم الفني لServBay.
س: تظهر لي رسالة خطأ في الكود: Call to undefined function ldap_connect()
؟
ج: يشير هذا إلى أن امتداد OpenLDAP في PHP لم يُحمّل أو يُفعّل بشكل صحيح. راجع الفقرة السابقة للتحقق من حالة الامتداد باستخدام phpinfo()
.
س: تم تفعيل الامتداد لكن تظهر لي أخطاء LDAP عند الاتصال أو الربط.
ج: تحقق من إعداداتك - عنوان الخادم، المنفذ، بيانات المصادقة (DN وكلمة المرور). رسائل خطأ LDAP المستخرجة عبر ldap_error()
قد تساعدك في التشخيص، كرسالة “Invalid credentials” أو “Can't contact LDAP server”. تأكد أيضًا من تشغيل خادم LDAP ووجود اتصال شبكي إليه.
خاتمة
يُقدم لك ServBay وسيلة سهلة وسريعة للوصول إلى امتداد OpenLDAP في PHP واستخدامه. عبر خطوات تحقق بسيطة، يمكنك التأكد من جاهزية بيئة PHP لديك للتواصل مع خوادم LDAP. وبفضل مكتبة PHP القوية، يستطيع المطور إضافة خصائص مثل مصادقة المستخدمين، واستعلامات الدليل، لتطبيقات الويب المحلية بسهولة في ServBay—مما يوسع نطاق الاستخدام ويُعزز من إمكانيات مشاريعك.