صفر
دروس CakePHP # 5 : بناء نظام تعدد المستخدمين والمجموعات والصلاحيات.
برمجة وأفكار برمجية CakePHP الزيارات: 538 التعليقات:4
نبدأ في هذه التدوينة بموضوع هام لأي تطبيق ويب يعمل بشكل عملي ألا وهو نظام إعداد المستخدمين ومجموعاتهم والصلاحيات لكل مستخدم ونظام تسجيل الدخول والخروج وغير ذلك من الأمور الهامة لكل نظام ، وبعد كل تدوينة جديدة نقوم بدمج ما تعلمناه بنظام "بنك الأفكار الابداعية" . وهذا التدوينة تفيد بشكل كبير الأخوة الذين لديهم خبرة سابقة في الكيك ، وسوف نستخدم لبناء هذا النظام كومبوننت Auth فقط بدون استخدام ACL للصعوبات المتعلقة بها ، سوف يكون تطبيق هذا الدرس على الاصدار السابق للكيك وهو cake_1.2.0.7692-rc3 وذلك لوجود اختلافات مع الاصدار الحالي للكيك وسوف نحاول معا بعد تطبيق هذا الدرس الانتقال إلى الاصدار الأخير من الكيك، ولتنزيل الاصدار cake_1.2.0.7692-rc3 انقر هنا .
مميزات النظام الذي سوف نبنيه في هذه التدوينة :
1- نظام مرن في منح الصلاحيات على كل Action تابع لأي Controller .
2- يمكن تعيين الصلاحيات للمجموعات .
3- عند وضع أي مستخدم في أي مجموعة فإن المستخدم سوف يمنح كافة صلاحيات تلك المجموعة.
4- يتم إنشاء قائمة لكل مستخدم عند تسجيل دخوله بحسب صلاحياته ، بحيث يعرض له الـ Controller الذي له صلاحية عليه. ( هذه الميزة أراحتني كثيرا كثيرا ) .
5- إدارة الصلاحيات تتم بشكل سهل جدا ومريح بدون تعقيدات ACL
6- يدمج في أي نظام قائم لك بسهولة بدون التأثير على ما تقوم به.
نبدأ الآن ببناء نظام تعدد المستخدمين ... أولا سوف نقوم بإنشاء 5 جداول جديدة في قاعدة البيانات لديك ( ملاحظة : لنسخ الكود انقر على صورة الورقة التي بجوار الطابعة أعلى كل صندوق للكود ثم انسخ ما سيظهر في الصندوق ) : [code language='sql'] CREATE TABLE IF NOT EXISTS `groups` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) collate utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE IF NOT EXISTS `groups_permissions` ( `group_id` int(11) NOT NULL, `permission_id` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE IF NOT EXISTS `groups_users` ( `group_id` int(11) NOT NULL, `user_id` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE IF NOT EXISTS `permissions` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) collate utf8_unicode_ci NOT NULL, `title` varchar(250) collate utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(40) collate utf8_unicode_ci NOT NULL, `email_address` varchar(50) collate utf8_unicode_ci NOT NULL, `password` varchar(50) collate utf8_unicode_ci NOT NULL, `language_id` int(11) NULL, `active` tinyint(1) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; [/code] نقوم الأن بإضافة بعض البيانات الهامة للجداول السابقة كما يلي : [code language='sql'] INSERT INTO `groups` (`id`, `name`, `created`, `modified`) VALUES (1, 'Administrators', '2008-11-07 18:44:13', '2008-11-07 21:47:24'); INSERT INTO `groups_permissions` (`group_id`, `permission_id`) VALUES (1, 1); INSERT INTO `groups_users` (`group_id`, `user_id`) VALUES (1, 1); INSERT INTO `permissions` (`id`, `name`, `title`, `created`, `modified`) VALUES (1, '*', 'جميع الصلاحيات', '2008-11-07 18:43:40', '2008-12-12 15:45:27'); INSERT INTO `users` (`id`, `username`, `email_address`, `password`, `language_id`, `active`, `created`, `modified`) VALUES (1, 'admin', 'na@nahedh.com', '3c2164ad6d86cefb2151cf1e1a8d6a2a084b759e', 2, 1, '2008-11-07 18:45:34', '2008-12-19 23:18:15'); [/code] بعد إعداد الجداول وإضافة البيانات إليها سوف يكون لدينا مستخدم واحد اسمه admin وكلمة المرور الخاصة به مشفرة وهي 1111 ، له كافة الصلاحيات * لأنه في مجموعة Administrators ، والأن نقوم بإنشاء الملفات المطلوبة : أولا نقوم بإنشاء الـ Models المطلوبة للربط مع الجداول السابقة : قم بإنشاء الملف التالي :
app/models/user.php
[code language='php'] array('email'), 'password' => array('alphaNumeric'), 'active' => array('numeric') ); var $hasAndBelongsToMany = array( 'Group' => array('className' => 'Group', 'joinTable' => 'groups_users', 'foreignKey' => 'user_id', 'associationForeignKey' => 'group_id', 'unique' => true ) ); } ?> [/code]قم الان بإنشاء الملف :
app/models/group.php
[code language='php'] array('className' => 'Permission', 'joinTable' => 'groups_permissions', 'foreignKey' => 'group_id', 'associationForeignKey' => 'permission_id', 'unique' => true ), 'User' => array('className' => 'User', 'joinTable' => 'groups_users', 'foreignKey' => 'group_id', 'associationForeignKey' => 'user_id', 'unique' => true ) ); } ?> [/code] ثم الملف:app/models/permission.php
[code language='php'] array('className' => 'Group', 'joinTable' => 'groups_permissions', 'foreignKey' => 'permission_id', 'associationForeignKey' => 'group_id', 'unique' => true ) ); } ?> [/code] نأتي الان إلى إنشاء الـ Controllers : قم بإنشاء الملف التالي :
app/controllers/users_controller.php
[code language='php']Session->del('Permissions');
$this->redirect($this->Auth->logout());
}
..إقرأ المزيد |
التعليقات:4
قبل البدء في أول تدوينة عملية لمشروع "بنك الأفكار الابداعية" أود أن أشكر كافة الأخوة الذين شجعوني على الاستمرار بهذه الحلقات وقد رغب البعض بأن يكون هناك شرح لبعض مهارات التعامل مع برامج التشارك بالملفات والتطوير الجماعي المتبع في عالم المصادر المفتوحة ونزولا عند رغبة هؤلاء الأخوة أود أن أوضح كيف يمكن للأعضاء في المشروع الربط مباشرة في نظام تنقيح وتطوير المشروع بشكل متزامن ومنظم أو الحصول على نسخة ليليلة Nightly ( إن صح التعبير ) وذلك عبر استخدام خدمة
ثالثا : سوف نحتاج إلى بعض الصور البسيطة مثل صورة سهم متجة للأعلى وآخر للأسفل وكذلك صورة متحركة لعمليات التحديث عبر AJAX وأيقونة للمشاركة وأقترح الصور التالية :
رابعا : نحتاج إلى محرر للكود وأترك لكل أخ اختيار محرره المناسب له ، أما بالنسبة لي فسوف أستخدم
نبدأ الان بتطبيق المراحل التي تكلمنا عنها في التدوينة السابقة ، وسوف يكون ذلك بشكل سريع حتى نبدأ بشكل تطبيقي أكثر ...
أما الشاشة الثانية فهي شاشة الأفكار الابداعية لكلك موضوع كما يلي :
هذا بالنسبة للتجهيز ..... أتمنى أن تكون الفكرة واضحة وذلك حتى يتم الانتقال للمرحلة التالية وهي مرحلة التنفيذ عبر تصميم قاعدة البيانات والبدء بالبرمجة الفعلية...
أبدأ في هذه التدوينة باول التطبيقات العملية لفهم إطار


آخر التعليقات
ابو الريم: مشكور يا استاذ ناهض على الشرح