Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

نظام تسجيل دخول أفضل

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by miahood (you can also view the original English article)

قامت Net.tuts + بنشر العديد من البرامج التعليمية الرائعة على أنظمة تسجيل دخول المستخدم. معظم البرامج التعليمية تتعامل فقط مع مصادقة المستخدم ، والذي يسمح لمستويين من الأمن: تسجيل الدخول وعدم تسجيل الدخول. بالنسبة للعديد من المواقع ، هناك حاجة إلى درجة أعلى من التحكم للتحكم في الأماكن التي يستطيع المستخدمون الذهاب إليها وما يمكنهم فعله. Creating an access control list (ACL) system will give you the flexibility for granular permissions.



المقدمة

Final Product

تخيل أنك تدير موقعًا تعليميًا رائعًا يتيح للمستخدمين التعرف على مجموعة متنوعة من تقنيات تطوير الويب. In addition to your normal readers, you have some premium subscription members, as well contributing authors and administrators.

Your problem

أنت تريد تقييد المستخدمين على صفحات محددة فقط يسمح لهم حسابهم الخاص بالوصول إليها.

الحل

سيتيح لك تنفيذ قائمة التحكم في الوصول قدرًا كبيرًا من التحكم في ما يمكن للمستخدمين الوصول إليه على موقعك ولا يمكنهم الوصول إليه .

إذا كنت تعرض العرض التوضيحي ، المتاح مع الكود المصدري القابل للتنزيل ، فسيتم استقبالك بصفحة فهرس تختبر ACL لكل مستخدم.  You can select different links at the bottom to view the ACL for the different users.  إذا قمت بالنقر فوق ارتباط "شاشة المسؤول" بالقرب من الجزء العلوي ، فيمكنك عرض عينة من واجهة الإدارة التي تسمح لك بإدارة المستخدمين والأدوار والأذونات.  ملاحظة: سيقوم نظام الإدارة باستعادة قاعدة البيانات كل 30 دقيقة للتأكد من أن كل شيء يبقى في الأعلى والأعلى.  تقوم ملفات التنزيل أيضًا بتطبيق أمان ACL على موقع المسؤول ، لذلك إذا كان المستخدم رقم واحد لا يملك إذن "الوصول إلى المسؤول" ، فلن تتمكن من الوصول إلى موقع المسؤول.

سيمكنك هذا النظام من إنشاء مجموعات مختلفة من المستخدمين (مثل الضيوف وأعضاء متميزين والمساهمين والمشرفين). سنتمكن من تعيين أذونات فريدة لكل مجموعة ، وكذلك للمستخدمين الفرديين.  دعونا نبدأ بإعداد قاعدة بيانات MySQL.


الخطوة 1:  إنشاء قاعدة البيانات 

سيتم تخزين ACL لدينا في قاعدة بيانات علائقية باستخدام ستة جداول (بما في ذلك الجدول للمستخدمين).  يجب أن يكون لديك بالفعل قاعدة بيانات تم إعدادها في بيئة المضيف.  سننشئ هيكل الجدول التالي: 

Database tables

يتوفر رمز إنشاء قاعدة البيانات في الملفات المصدر (install.sql) ،  وهناك أيضا ملف آخر (sampleData.sql) التي ستخلق 4 مستخدمين عينة ، جنبا إلى جنب مع العديد من الأدوار والأذونات بالنسبة لك لاختبار مع.   ما عليك سوى فتح الملفات باستخدام محرر النصوص المفضل لديك ، ونسخ / لصق الشفرة في لوحة SQL في phpMyAdmin. 


الخطوة 2: تضمين قاعدة البيانات

نحتاج إلى إنشاء ملف تضمين حتى نتمكن من الاتصال بقاعدة بياناتنا.  قم بإنشاء ملف يسمى assets / php / database.php وأضف الكود التالي إليه (استبدل القيم المتغيرة بالمعلومات المناسبة لحالتك للاستضافة):  

في السطر الأول من الشفرة ، نسمي  session_start () ؛ لن نستخدم بالفعل متغيرات الجلسة ولكنك ستحتاج إليها كجزء من نظام تسجيل دخول المستخدم . Then, we call ob_start() to create an output buffer  .  عادة، عندما يولد بي الصفحة، إرسالها إلى المستعرض كما أنها تولد. باستخدام ob_start()، الصفحة، ورؤوس لا يتم إرسالها إلى المستعرض حتى أنهم قد يتم تحميلها بالكامل، أو حتى ونحن ندعو ob_end_flush(). بالتخزين المؤقت للصفحة، نحن قادرون على إعادة توجيه استخدام بي إتش بي في أي مكان على الصفحة، بدلاً من مجرد في الجزء العلوي. بعد أن يتم إرسال الرؤوس، خيارنا الوحيد في إعادة توجيه مع جافا سكريبت. هاكر مغامر يمكن إيقاف تشغيل جافا سكريبت بسهولة، ومن ثم نرى الصفحة غير آمنة في جميع ذلك للمجد. هذا خط واحد يسمح لنا برفض وصول المستخدم عند أي نقطة في الصفحة إذا لزم الأمر.

خطوط 4-8 إعداد المتغيرات. $ hasDB هو منطقي يستخدم لتحديد ما إذا كنا متصلين. $server$user$pass, and $db are the connection arguments for the server. يربط الخط 9 إلى الملقم، بينما يحدد خط 10 إذا تم الاتصال الناجح. إذا كان الأمر كذلك ، فإننا نختار قاعدة البيانات التي نستخدمها ؛ إذا لم يكن الأمر كذلك ، فإننا نعرض رسالة خطأ باستخدام die () . 


 الخطوة 3: إنشاء فئة ACL

هذه الخطوة طويلة إلى حد ما ، لأننا نقوم بإنشاء فئة ACL التي ستشكل أساس نظامنا.   I apologize in advance for the length of this step. 

ACL

 سيكون نظام ACL لدينا موجهًا للكائن ، لذلك لنبدأ في إنشاء ملف الفصل الدراسي.   نبدأ بإضافة تعريف الفئة وتعريفات المتغير والمنشئ إلى الملف /assets/php/class.acl.php: 

تحليل

بعد إنشاء تعريف الفئة ، نقوم بإنشاء متغيرات الفئة الثلاثة لتخزين المعلومات التي سيتم استخدامها في إنشاء قائمة التحكم بالوصول (ACL). 

The Constructor Method 

The __constructor() function is used to initialize the object when we want to load an ACL.  It is called automatically when we call new ACL();.  ومن ثم يتم تمرير وسيطة اختيارية واحدة للمستخدم لتحميل ACL. Inside the constructor, we check to see if a user ID was passed in. If no ID was passed, we assume that we will load the ACL for the currently logged in user; so we read in the session variable for that. Alternatively, if we pass in a user ID, it allows us to read and edit the ACL for a user other than the one logged in (useful for your admin page).

getUserRoles () لإنشاء صفيف من الأدوار التي تم تعيينها للمستخدم وتخزينها في متغير فئة $ userRoles . في نهاية المُنشئ ، نسميه buildACL () لإنشاء قائمة التحكم بالوصول (ACL) الفعلية. الطريقة المسماة ACL () هي عكاز لتثبيت PHP4. عند استدعاء ACL () جديد في PHP5 ، يقوم مترجم PHP بتشغيل أسلوب __constructor (). ومع ذلك ، عند تشغيل نفس الكود في PHP4 ، يقوم المترجم بتشغيل ACL (). من خلال توفير طريقة تسمى نفس الفئة ، نجعل فئة PHP4 متوافقة.

في أي وقت نقوم فيه بإنشاء عنصر ACL جديد بتمرير معرف مستخدم ، سيحتفظ هذا الكائن بأذونات المستخدم الذي تم تمريره.

طرق المساعد

الآن ، يتيح إضافة بعض أساليب المساعد أكثر إلى نفس الملف فئة. ستوفر هذه الطرق الدعم للطرق الأخرى من خلال تنفيذ المهام المتخصصة:

getUserRoles ()

سيعود getUserRoles () إلى صفيف من الأدوار التي تم تعيينها للمستخدم الحالي. أولاً ، سنقوم ببناء جملة SQL المناسبة وتنفيذها. باستخدام while () ، نقوم بالتكرار خلال كل نتائج المطابقة ، وأخيرًا نعيد مجموعة من المعرفات. وبالمثل ، ستقوم getAllRoles () بإرجاع كافة الأدوار المتوفرة (وليس فقط تلك التي تم تعيينها للمستخدم). استنادًا إلى قيمة الوسيطة ، بتنسيق $ ، ستعرض مصفوفة من المعرفات لجميع الأدوار ، أو صفيفًا من الصفيفين الترافقيين مع معرف واسم كل دور. هذا يسمح وظيفتنا للقيام بواجب مضاعف. إذا أردنا استخدام مجموعة من أدوار المستخدم في MySQL ، فنحن بحاجة إلى مجموعة من معرفات الأدوار ؛ ولكن إذا أردنا عرض الأدوار على صفحتنا ، فسيكون من المفيد وجود مصفوفة واحدة تحتوي على جميع المعلومات الموجودة بها.

buildACL

ينشئ buildACL () صفيف الأذونات للمستخدم وهو قلب النظام. أولاً ، نتحقق مما إذا كان المستخدم قد تم تعيينه لأية أدوار. إذا كانت كذلك ، فإننا نستخدم array_merge () لدمج مصفوفة الأذونات الموجودة مع الصفيف الجديد الذي تم إرجاعه من استدعاء getRolePerms () (الذي يحصل على جميع الأذونات لجميع الأدوار التي تم تعيينها للمستخدم). ثم نفعل نفس الشيء لأذونات المستخدم الفردية ، وهذه المرة استدعاء getUserPerms (). من المهم أن نقرأ أن المستخدم يوافق ثانية لأن array_merge () يستبدل مفاتيح مكررة. يضمن قراءة أذونات المستخدم الثانية أن الأذونات الفردية ستتجاوز أي أذونات موروثة من أدوار المستخدم.

كافة الدالات getPermKeyFromID () ، getPermNameFromID () ، getRoleNameFromID () و getUsername () هي ببساطة وظائف "بحث". تسمح لنا بالمرور في معرف وإرجاع القيمة النصية المناسبة. يمكنك أن ترى أننا نبني جملة SQL ، ثم ننفذها ونرجع النتيجة.  بعد ذلك سنضيف في الدالتين اللتين ستسحبان الأذونات من قاعدة البيانات.  

These functions are essentially identical except for the tables they pull from.  الوسيطة الفردية هي المعرّف للأدوار / المستخدمين الذين تريد سحبهم.  يمكن تمرير وظيفة الأدوار إلى مصفوفة أو عدد صحيح ، بينما يمكن تمرير وظيفة المستخدم فقط بعدد صحيح. باستخدام is_array () ، نحدد كيفية التعامل مع الوسيطة لوظيفة إذن الدور. إذا كانت صفيفًا ، فإننا نستخدم أداة implode () لإنشاء قائمة مفصولة بفواصل. في كلتا الحالتين ، نستخدم هذه القيمة في SQL. ثم ، نقوم بإنشاء صفيف فارغ جديد يسمى $ perms - سيخزن هذا الأذونات محليًا في الوظيفة.

داخل الحلقة while () ، نقوم بالعديد من الوظائف. أولاً ، سننشئ المتغير $ pK ، والذي سنستخدمه كاسم مفتاح الصفيف. لأننا سوف نبحث عن هذه القيمة لتحديد ما إذا كان المستخدم لديه إذن محدد ، فمن المهم أن يكون لدينا في شكل موحد ، وهذا هو السبب في أننا نستخدم strtolower (). إذا كانت قيمة المفتاح فارغة ، فإننا نتخطى التكرار التالي باستخدام continue. بعد ذلك ، ننظر إلى صف $ ['value'] لتعيين قيمة منطقية ضمنية للإذن. هذا يضمن أن القيمة الفعلية فقط لـ "1" في الجدول ستعادل القيمة الحقيقية (أي أن المستخدم لديه الإذن) ، وهو أمر مهم للأمان. وإلا فإننا نقوم بتعيين الإذن إلى false. في نهاية الدالة ، نقوم بإنشاء مصفوفة تحتوي على العديد من المفاتيح المسماة حتى نتمكن من الحصول على جميع المعلومات حول الإذن. يتم تعيين هذا الصفيف إلى مفتاح مسمى جديد في صفيف $ perms الذي أنشأناه سابقًا. لاحظ أننا نستخدم $ pK لإنشاء فهرس مسمى بشكل مناسب. وأخيرا نعود المصفوفة.

يمكنك رؤية ذلك في المصفوفة التي تم إرجاعها ، هناك اسم فهرس "موروث". هذا له أهمية خاصة ل ACL. إذا تلقى المستخدم إذنًا لأنه ينتمي إلى دور تم تعيينه إلى المستخدم ، فسيتم اعتباره موروثًا. إذا تم تعيين الأذونات للمستخدم يدويًا ، فلا يتم توريثها.

في getAllPerms () ، نبني قائمة بجميع الأذونات المتاحة. على غرار getAllRoles () ، يمكننا تمريرها في وسيطة تنسيق لتحديد كيفية إرجاع النتائج. الآن للجزء الأخير من الفصل:

هذه الطريقتين الأخيرتين مهمتان جداً لوظائف ACL. userHasRole () يقبل وسيطة واحدة من معرّف دور. من خلال التكرار عبر جميع العناصر في مصفوفة userRoles $ ، يمكننا تحديد ما إذا كان المستخدم قد تم تعيينه لهذا الدور. إذا كان الأمر كذلك ، فإننا نعود إلى صواب أو خطأ. hasPermission () هي الطريقة التي نستخدمها لتحديد ما إذا كان يمكن للمستخدم الوصول إلى شيء ما. نحن نمرر المفتاح للإذن الذي نريد التحقق منه. نجعلها موحدة من خلال تحويلها إلى أحرف صغيرة ، ومعرفة ما إذا كان هناك فهرس بهذا الاسم في مصفوفة $ perms. إذا كان هناك ، نتحقق من أنه قد تم تعيينه على "1" وأن يرجع صحيحًا ، أو يرجع كاذبة. هذه هي الوظيفة التي سنستخدمها إذا أردنا معرفة ما إذا كان بإمكان المستخدم القيام بشيء ما.


الخطوة 4: إدارة المستخدم  

الجزء الأول من قسم الإدارة لدينا سوف يتعامل مع إدارة المستخدمين. نحتاج إلى إنشاء أربع واجهات مختلفة للتعامل مع جوانب إدارة المستخدمين: قائمة المستخدمين حتى نتمكن من اختيار واحد لتحريره ، وعرض قائمة تفصيلية للمستخدمين ، وتعيين المستخدمين لأدوار ، ومنح المستخدمين أذونات.

User Forms

افتح /admin/users.php وأضف الشفرة التالية:

وكما هو الحال دائمًا ، نحتاج إلى تضمين قاعدة البيانات وملفات ACL وإعداد كائن ACL. ثم نقوم بإعداد الأمان للصفحة. في هذه الحالة ، نحن نضمن حصول المستخدم على الإذن "access_admin". إذا لم يفعلوا ذلك ، يتم إعادة توجيههم.

ملاحظة: إذا قمت بتغيير أذونات ACL بحيث لم يعد لدى المستخدم # 1 إذن 'access_admin' ، فلن تتمكن من الوصول إلى موقع المسؤول. أيضا ، يجب عليك أولا الذهاب إلى / index.php قبل أن تذهب إلى أي من صفحات المسؤول ، كما يحدد index.php متغير جلسة العمل الذي يعينك userID # 1.

الآن هذا هو التخطيط الأساسي للصفحة. في الخطوات التالية ، سنحل محل <! - PAGE CONTENT -> أعلاه مع بعض التعليمات البرمجية لإدارة المستخدمين. سنستخدم الإجراء $ querystring المتغير لتحديد أي من واجهات المستخدم التي يجب أن نقوم بعرضها. هناك أربع قيم ممكنة سنتناولها: إذا كانت فارغة ، فإننا نعرض قائمة بالمستخدمين الحاليين. إذا تم ضبطه على "مستخدم" ، فإننا نعرض النموذج لمستخدم واحد. إذا تم ضبطه على "الأدوار" ، فسنقوم بعرض النموذج لتعيين مستخدم. إذا تم ضبطها على "permers" ، فإننا نعرض النموذج لمنح أذونات المستخدم.

قائمة المستخدمين

أضف هذا الرمز داخل div مع "هوية" الصفحة:

المفهوم هنا بسيط جدا. نحن نبني استعلام SQL ، ونشغّله من خلال النتائج. لكل مستخدم ، نقوم بإنشاء رابط يمكننا من تحرير هذا المستخدم.

تحرير الفرد للمستخدم

الآن ، أضف هذا الرمز مباشرةً أسفل كتلة التعليمات البرمجية السابقة:

عندما نقوم بتحرير مستخدم ، نحتاج إلى تحميل قائمة ACL لذلك المستخدم. سيتيح لنا ذلك معرفة الأدوار والأذونات التي لديهم. نبدأ ذلك عن طريق إنشاء كائن ACL جديد ، وتمرير في معرف المستخدم $ من سلسلة الاستعلام (بهذه الطريقة نقوم بتحميل ACL الخاص بهذا المستخدم ، بدلاً من المستخدم الذي قام بتسجيل الدخول). بعد ذلك ، سيذهب نموذج مستخدم التعديل المعتاد. ستكون الأشياء النموذجية حقول نصية لتحرير اسم المستخدم وكلمة المرور وما إلى ذلك. وفي ما يلي سرد ​​الأدوار التي تم تعيينها للمستخدم ، وكذلك توفير رابط حتى نتمكن من تعيين المستخدم إلى أدوار أخرى. تقوم الخطوط 10-16 بتحميل كافة الأدوار التي تم تعيينها للمستخدم ، وتقوم بطباعتها كعناصر قائمة باستخدام foreach () . ثم نقوم بإدراج أذونات المستخدم بطريقة مشابهة. نحن نطبع فقط الأذونات التي يمتلكها المستخدم ، وليس تلك التي تم تعيينها على "false".

User Detail

Assign Roles

سينتهي شكل أدوار التكليف الخاص بنا بهذا الشكل:

User Roles

أضف هذا الرمز مباشرة أسفل كتلة الكود السابقة:

أول شيء يتعين علينا القيام به هنا هو إنشاء نموذج وجدول. سيتضمن الجدول 3 أعمدة: أحدهما للدور وواحد لمربع الاختيار الخاص بالأعضاء وواحد لمربع الاختيار غير العضو. بعد إنشاء كائن جديد لـ ACL ، نقوم بتحميل صفيف لجميع الأدوار باستخدامgetAllRoles () . سيسمح لنا ذلك بعرض عناصر الإدخال لكل دور ، وليس فقط العناصر التي تم تعيينها للمستخدم.

داخل حلقة foreach () ، نقوم بما يلي: نبدأ صفًا جديدًا ونطبع تسمية تحمل اسم الدور. ثم نطبع إدخال زر الراديو. يتم إنشاء اسم ومعرف أزرار الاختيار لكل دور باستخدام تنسيق "role_ [roleID]" (أي role_0012). تحدد السطور 13 و 16 أي من أزرار الاختيار يجب التحقق منها. سيتم التحقق من أول واحد إذا تم تعيين المستخدم بالفعل إلى المجموعة ، في حين سيتم التحقق من الثانية إذا لم تكن. لاحظ أن واحدًا لديه قيمة "1" (للتعيين) ، والآخر له قيمة "0" (لعدم التعيين). ثم ننهي الصف.

بعد كل ذلك ، نضيف بعض العناصر المخفية التي تخبرنا بما نقوم بحفظه ، وما معرف المستخدم لحفظه. ثم نضيف زر الإرسال والإلغاء.

تعيين الأذونات

يشبه نموذج أذونات التعيين نموذج الأدوار ، ولكن مع مدخلات مختلفة ، لذلك دعونا نضيف هذا الرمز:

مثل نموذج الأدوار ، نبدأ بإضافة نموذج وجدول ، هذه المرة مع عمودين. ثم نقوم بإنشاء كائن ACL ، وسحب مصفوفة الأذونات (سطر 8) ، والحصول على مصفوفة بجميع الأذونات (السطر 9). في حلقة foreach () نقوم بطباعة صف جديد واسم الإذن. ثم نبدأ تحديد عنصر. سيحتوي الإدخال المحدد على 3 خيارات: Allow و Deny و Inherit. نحن ننظر إلى قيمة rPerms $ [$ v ['Key']] ['value'] لمعرفة الخيار الذي يجب تحديده. لن يتم تحديد السماح أو الرفض إذا تم توارث قيمة الإذن وذلك بفضل $ rPerms [$ v ['Key']] ['التي تم توريثها']! = true . إذا تم الحصول على الإذن ، فسيتم تحديد الخيار الموروث.

يعمل الخط 23-32 على تحسين خيار الوراثة. إذا تم ورث الإذن ، فسيتم تحديده. ثم يحدد قيمة الإذن الموروث ويقوم بتعيين المتغير $ iVal حتى نتمكن من استخدام القيمة النصية في تسمية الخيار على السطر 33. بعد إنهاء الإدخال المحدد والجدول ، نضيف في المدخلات المخفية لإعداد خيارات الحفظ ، وإضافة أزرار الإرسال والإلغاء.

وبمجرد تشغيل هذا الرمز ، سننتهي بسلسلة لكل إذن متاح ، ونزولاً يشير إلى ما إذا كان المستخدم يمتلكها أم لا.

User Permissions

حفظ البيانات

أضف هذا الرمز إلى /admin/users.php أعلى علامة نوع المستند مباشرةً:

يتحقق هذا الرمز أولاً لمعرفة ما إذا تم إرسال شيء ما عن طريق النظر إلى $ _POST ['action'] . هذه هي القيمة التي كانت في أحد عناصر النموذج المخفية في النموذجين اللذين أنشأناهما.

إذا قمنا بتقديم نموذج الأدوار ، فسيحدث ما يلي:

  1. نقوم بإنشاء $ queryirring $ redir حيث يتم إرسال النموذج بعد عملية النموذج.
  2. نحن نتابع جميع المتغيرات $ POST.
  3. باستخدام substr () نجد ما إذا كانت أول 5 أرقام من اسم المتغير هي "role_". بهذه الطريقة نحصل فقط على مدخلات الأذونات في الخطوات التالية.
  4. إذا كانت قيمة الإدخال الحالي تساوي "0" أو "x" (على سبيل المثال ، لا نريد أن يكون لهذا المستخدم هذا الدور) ، فنحن نقوم بإجراء استعلام الحذف. إذا حذفت الدور من جدول user_roles ، فلن يتم تعيين المستخدم إلى الدور.
  5. إذا كانت القيمة ليست "0" أو "س" (سطر 14) ، فنحن نقوم بإجراء الاستبدال.
  6. لأي استعلام ، نحن نستخدم sprintf () للأمان ( sprintf () يجبر كتابة المتغيرات ويساعد على الحماية ضد هجمات حقن SQL مزيد من المعلومات ).
  7. نحن ننفذ SQL باستخدام mysql_query () .

ملاحظة حول استعلام الاستبدال: بناء الجملة البديل عبارة عن بنية MySQL خاصة تسمح بتحديث أو إدراج سلس. باستخدام الاستبدال ، يمكن أن ينقذنا من كتابة الكثير من كود PHP. عندما أنشأنا جدول user_roles ، أنشأنا فهرسًا فريدًا في حقول معرف المستخدم والحقل. عندما ننفذ عبارة "الاستبدال" ، فإنها تنظر أولاً في الجدول لمعرفة ما إذا كان إدراج صف جديد سيؤدي إلى إنشاء نسخة مكررة (أي وجود صف بنفس قيم الفهرسة موجود بالفعل). إذا كان هناك صف يطابق الفهارس ، فإنه يقوم بتحديث هذا الصف. إذا لم يكن هناك ، فإنها تدرج صفًا جديدًا. لمزيد من المعلومات ، راجع موقع مطور MySQL .

إذا قمنا بإرسال نموذج الأذونات ، فإن العملية هي نفسها ، إلا أننا نبحث عن بادئة مختلفة على أسماء الإدخال ، وباستخدام جدول قاعدة بيانات مختلف. وبمجرد الانتهاء من أي عمليات ، نستخدم العنوان ("الموقع: ...") لإعادة التوجيه إلى الصفحة التي كنا عليها ، ونلحق متغير $ queryir $ redir الذي أجريناه.


الخطوة 5: إدارة الأدوار

الآن بعد أن انتهينا من استخدام النماذج لإدارة مستخدمينا ، نحتاج إلى إدارة أدوارنا. ستكون الأدوار أكثر بساطة ، ولا يوجد سوى إجراءين: عرض قائمة بالأدوار ، أو تحرير دور. أنشئ /admin/roles.php مع الشفرة التالية:

أدوار القائمة

كما هو الحال مع صفحة المستخدمين ، نبدأ بالبدء في إنشاء كائن ACL وتنسيق الصفحة. يتمثل الإجراء الافتراضي لدينا (الصفحة التي يتم تحميلها بدون أي سلسلة استعلام) في سرد ​​الأدوار المتاحة ، لذا ضع هذا الرمز بدلاً من <! - PAGE CONTENT ->:

سلسلة استعلام مواقع المعلومات ثم نخزن قائمة بجميع الأدوار المتاحة في الأدوار $ باستخدام getAllRoles () . في كل تكرار لحلقة foreach () ، نقوم بإنشاء ارتباط يؤدي بنا إلى النموذج لتحرير دور فردي. إذا لم تكن هناك أدوار في مصفوفة الأدوار $ ، فإننا نعرض رسالة ودية. وأخيرًا ، نضيف زرًا يسمح لنا بإضافة دور جديد.

تحرير الدور

أضف هذه الشفرة في /admin/roles.php في المربع السابق:

بعد التحقق للتأكد من وجود متغير سلسلة البحث ، سنرى إذا تم تمرير roleID في سلسلة الاستعلام. إذا كان أحدنا ، نفترض أننا نقوم بتحرير دور ، إن لم يكن نحن نقوم بإنشاء واحد (نحن عرض رأس حسب الاقتضاء). ثم نقوم بإنشاء نموذج. داخل النموذج ، نحتاج إلى إدخال نص لاسم دورنا ، وجدول لاحتواء الأذونات. يحتوي الجدول على أعمدة لاسم الإذن ، والسماح ، والرفض ، والتجاهل. مثلما فعلنا أثناء تعديل أذونات المستخدم ، يجب أن نتعقد من خلال مجموعة جميع الأذونات (السطر 15 ، $ myACL-> getAllPerms ('full') )

في كل صف ، نقوم بطباعة اسم الإذن و 3 أزرار للراديو. تستخدم أجهزة الراديو نفس التسميات مثل نموذج المستخدم ("perm_ [permID]"). يتم اختيار "السماح" أو "رفض" وفقًا لقيمة الإذن المخزن (وذلك بفضل السطور 19 و 22). إذا حددت "تجاهل" ، فلن يتم تخزين أي قيمة لهذا التحرير / الدور التمهيدي. لاحظ أن أول اثنين if () كتلة لها && $ _GET ['roleID']! = '' فيها. هذا يضمن أنه إذا لم يتم تمرير معرف المستخدم (أننا نقوم بإنشاء دور جديد) ، يتم تحديد التجاهل بشكل افتراضي. ثم نقوم بإضافة المدخلات المخفية لضبط خيارات الحفظ ، وإغلاق النموذج. كما نضيف أيضًا نموذجًا آخر يتضمن واجبات مخفية لحذف الدور ، ونموذج آخر من خلال زر إلغاء يؤدي إلى إرجاعنا إلى صفحة الأدوار.

إذا سار كل شيء وفقًا للخطة ، يجب أن نحصل على ما يلي عندما نحاول تعديل الأذونات لدور:

Role Permissions

حفظ البيانات

أدرج هذا الرمز في /admin/roles.php قبل علامة نوع المستند مباشرةً:

كما هو الحال في صفحة المستخدمين ، نتحقق مما إذا كان هناك شيء تم إرساله عبر $ _POST ، وما قيمة $ _POST ['action'] .  إذا كنا نقوم بحفظ دور ، فإننا نقوم بما يلي:

  1. قم بتنفيذ استعلام استبدال في جدول الأدوار. سيقوم هذا بتحديث / إدراج اسم الدور. تؤدي الأسطر من 8 إلى 13 وظيفة مهمة في حفظ الأدوار. إذا كنا نجري تحديثًا ، فلدينا بالفعل معرف لهذا الدور. ومع ذلك ، إذا قمنا بإدخال واحد ، فإننا لا نعرف هوية الدور. عندما نقوم بإجراء استعلام الاستبدال ، يتم إرجاع عدد الصفوف المتأثرة. إذا كان عدد الصفوف المتأثرة أكبر من 1 ، تم تحديث الصف ، لذلك يجب علينا استخدام معرف الدور من النموذج. إذا كانت الصفوف المتأثرة ليست أكبر من 1 ، تم إدراج الصف ، لذلك نستخدمmysql_insert_id () للحصول على معرف آخر صف مدرج.
  2. ثم نتعقب من خلال متغيرات $ _POST ويضمن السطر 16 أننا نقوم بمعالجة الصفوف فقط حيث يبدأ اسم الإدخال بـ "perm_".
  3. ويحصل الخط 18 على العوامة () للإذن ، بحيث ينتهي بنا المطاف بمجرد الرقم الصحيح للبيرم (حتى نعرف الإذن الذي نتعامل معه).
  4. إذا تم تشغيل ($ v == 'x') {...} في حالة اختيار "تجاهل" للحصول على إذن في النموذج. سيحاول حذف الصف من الجدول حيث يكون معرف الصف ومعرف الإذن صحيحين. إذا حدث هذا ، فنحن نستخدم المتابعة ؛ للذهاب إلى المتغير التالي.
  5. إذا وصلنا إلى هذه النقطة ، نفترض أننا نريد إضافة أو تحديث إذن لهذا الدور. لذا ، نستخدم صيغة "الاستبدال" التي استخدمناها في نموذج المستخدم. من المهم أن يكون لدينا دور ID و PermID هناك حتى يمكن لقاعدة البيانات التحقق من وجود صف موجود.
  6. وأخيرًا ، ننفذ SQL ونعيد التوجيه إلى صفحة الأدوار.

إذا قمنا بإرسال نموذج الحذف ، فسوف نحذف الدور من جدول الأدوار. ثم نحذف أيضًا أي سجلات من جداول user_roles و role_perms تتطابق مع معرّف الدور بحيث لا ينتهي بنا المطاف إلى المستخدمين والأذونات المخصصة للأدوار غير الموجودة. ثم نعيد التوجيه إلى صفحة الأدوار.


الخطوة 6: ضوابط المشرف

مثل أدوار المشرف ، سيكون لدى المشرف أذونات وظيفتين: قائمة الأذونات المتاحة ، وأذونات التحرير. ابدأ هذا الكود في /admin/perms.php:

ضوابط قائمة

ضع هذا الكود في صفحة div (بدلاً من <! - PAGE CONTENT ->):

سنستخدم أولاً getAllPerms () للحصول على مجموعة من جميع الأذونات. ثم سنقوم بتكرارها لبناء قائمتنا. سيؤدي كل تكرار من خلال حلقة foreach () إلى إنشاء رابط سيوجهنا إلى الصفحة لتعديل الإذن المعطى. إذا لم تكن هناك أذونات ، فإننا نعرض رسالة تقول ذلك ، وننهي النموذج باستخدام زر "إذن جديد". والنتيجة:

Permissions Form

تحرير الإذن

لتعديل / إضافة إذن فردي ، نحتاج إلى إضافة هذا الرمز فورًا بعد الحظر السابق:

كما فعلنا في نموذج الأدوار ، نتحقق مما إذا تم تقديم معرف الإذن في سلسلة البحث وعرض إما عنوان إضافة أو تحديث استنادًا إلى ذلك. نفتح علامة نموذج ، ونضيف مدخلين نصيين: أحدهما لاسم الإذن والآخر لمفتاح الأذونات. الاسم هو ما سيظهر في النماذج ، بينما المفتاح هو ما سوف نستخدمه في النصوص. يجب أن يكون المفتاح مشابهًا تمامًا للاسم ، باستثناء أنه لا يجب أن يكون به فراغات أو رموز ، ويجب أن يكون أقل. بالنسبة لكلا الحقلين النصيين ، نقدم القيم الافتراضية إذا كنا نقوم بالتحديث.

 في نهاية النموذج، ونضيف إلى المدخلات الخفية، وعلى زر الإرسال. ثم لدينا حذف وإلغاء النماذج.

احفظ البيانات

وأخيرًا ، نحتاج إلى حفظ نموذج الإذن ، لذا أضف هذا الرمز إلى أعلى /admin/perms.php أعلى نوع المستند مباشرةً.

مثل جميع النصوص البرمجية المقدمة ، نحتاج إلى معرفة الإجراء الذي تم تقديمه. إذا كنا نقوم بحفظ إذن ، فإننا نقوم بإجراء عملية استبدال. هذا إما تحديث أو إدراج حسب الاقتضاء. إذا قمنا بإرسال نموذج الحذف ، فإننا نقوم بإجراء استعلام الحذف. في كلتا الحالتين ، سيتم إعادة توجيهك إلى perms.php.


الخطوة 7: لوحة تحكم المشرف

نحن بحاجة إلى نقطة انطلاق لمسؤول ACL لدينا. سننشئ شيئًا بسيطًا مع روابط إلى الصفحات الثلاث. في ما يلي معاينة ورمز لها:

لا تحتاج إلى شرح ، لدينا 3 روابط لإدارة 3 جوانب مختلفة من قائمة ACL الخاصة بك.


الخطوة 8: تنفيذ ACL على موقعك

Index

يعد تطبيق نظام ACL الجديد على موقعك أمرًا سهلاً إلى حد ما. يجب أن تحتوي كل صفحة تريد تأمينها على قاعدة البيانات وملف ACL المضمن في الجزء العلوي. بعد ذلك ، يجب إنشاء مثيل جديد لكائن ACL.

على سبيل المثال ، لنفترض أنك أعددت الإذن باستخدام المفتاح "access_admin" وأردت استخدامه للتحكم في الوصول إلى واجهة المسؤول. في الجزء العلوي من صفحتك ، يمكنك استخدام هذا النص البرمجي للتحقق من ذلك:

كما ترى ، نقوم بإنشاء كائن ACL. نظرًا لأننا لا نمر في معرّف مستخدم كوسيطة ، فإن النظام سيقرأ متغير الجلسة $ _SESSION ['userID']. ثم نستخدم $ myACL-> hasPermission ('access_admin') للتحقق مما إذا كان المستخدم لديه هذا الإذن. إذا لم يتم ذلك ، يتم إعادة توجيههم إلى insPackission.php غير كافية. بهذه الطريقة لا يمكنهم الدخول إلى مناطق آمنة ليس لديهم أذونات لها.

في الملفات المصدر المقدمة ، قمت بتوفير ملف فهرس يوفر اختبارًا بسيطًا لقائمة التحكم بالوصول استنادًا إلى رمز المثال أعلاه. يعرض فهرس النماذج قائمة بجميع الأذونات ، والرموز التي تمثل إمكانية وصول المستخدم الحالي إلى كل منها. توجد أيضًا قائمة بالمستخدمين تسمح لك بتغيير المستخدم الذي يتم عرض ACL من أجله. هنا هو رمز فهرس العينة:


افكار اخيرة

عند دمجها مع نظام أساسي جيد لإدارة المستخدمين ، يعد نظام ACL طريقة رائعة لتأمين موقع الويب الخاص بك. باتباع هذه الخطوات ، يجب أن تكون قادرًا على إنشاء نظام أمان مرن خاص بك. نظام الإدارة الذي تم إنشاؤه هنا هو مثال أساسي لما يمكنك إنشاؤه إذا لم يكن لديك بالفعل إعداد نظام مشرف. يوضح كل المبادئ التي تحتاج إليها لإدارة قائمة التحكم بالوصول (ACL) بشكل فعال.    من ناحية أخرى ، إذا كنت قد أنشأت بالفعل نظام إدارة المستخدم الخاص بك ، فيجب أن يكون من السهل اتخاذ هذه التقنيات وتنفيذها في مشروعك الخاص.


Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.