✍️ المقدمة:
في أغلب المشاريع البرمجية، نحتاج إلى نظام صلاحيات يحدد ما يمكن للمستخدم فعله داخل التطبيق.
الكثير من المبرمجين يعتمدون على مكتبة جاهزة مثل [Spatie Laravel Permission]، ولكن ماذا لو أردت بناء نظامك الخاص بدون الاعتماد على مكتبات خارجية؟
في هذا المقال سأشرح لك بالتفصيل:
-
كيف أنشأت جداول Roles وPermissions مخصصة
-
كيفية ربطها بالمستخدم
-
وكيف قمت بإنشاء Middleware مخصص للتحقق من الصلاحيات
والأهم: بأسلوب قابل للتوسعة والتعديل مستقبلًا.
⚙️ الهيكل الأساسي للجداول:
أنشأنا 3 جداول رئيسية:
-
roles
– لتخزين الأدوار (admin, editor, user...) permissions
– لتخزين الصلاحيات (create_post, delete_user...)-
role_permission
– جدول وسيط يربط كل دور بصلاحياته -
user_role
– جدول يربط كل مستخدم بدوره
🛠️ إنشاء الجداول
1. جدول roles
:
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->timestamps();
});
2. جدول permissions
:
Schema::create('permissions', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->timestamps();
});
3. جدول role_permission
:
Schema::create('role_permission', function (Blueprint $table) {
$table->foreignId('role_id')->constrained()->onDelete('cascade');
$table->foreignId('permission_id')->constrained()->onDelete('cascade');
$table->primary(['role_id', 'permission_id']);
});
4. جدول user_role
:
Schema::create('user_role', function (Blueprint $table) {
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('role_id')->constrained()->onDelete('cascade');
$table->primary(['user_id', 'role_id']);
});
👤 ربط المستخدمين بالأدوار
في نموذج المستخدم (User Model):
public function roles()
{
return $this->belongsToMany(Role::class, 'user_role');
}
public function hasPermission($permission)
{
foreach ($this->roles as $role) {
if ($role->permissions->contains('name', $permission)) {
return true;
}
}
return false;
}
🔒 إنشاء Middleware مخصص
php artisan make:middleware CheckPermission
داخل الميدل وير:
public function handle($request, Closure $next, $permission)
{
if (!auth()->check() || !auth()->user()->hasPermission($permission)) {
abort(403, 'ليس لديك الصلاحية');
}
return $next($request);
}
ثم تضيفه في Kernel.php
:
'can' => \App\Http\Middleware\CheckPermission::class,
✅ مثال عملي على الاستخدام:
Route::get('/admin', function () {
return 'لوحة المشرف';
})->middleware('can:view_admin_panel');
💡 لماذا بنيت هذا النظام بدون مكتبة؟
(السبب)◄ | (التوضيح) |
---|---|
(خفة الأداء)◄ | (بدون تحميل تبعيات خارجية) |
(فهم أعمق للنظام)◄ | (تعلم العلاقات بين الجداول والتفكير المنطقي) |
(سهولة التخصيص)◄ | (يمكنك إضافة شروط مخصصة بسهولة) |
🚀 تحسينات مستقبلية مقترحة:
-
إمكانية إضافة صلاحيات للمستخدم مباشرة
-
واجهة إدارة للأدوار والصلاحيات
-
تسجيل محاولات الرفض (log) لأغراض الأمان
📌 الخلاصة:
إنشاء نظام صلاحيات مخصص باستخدام Laravel يعزز من فهمك للبنية العميقة للتطبيقات، ويساعدك على التحكم الكامل في من يمكنه فعل ماذا.
ورغم وجود مكتبات تسهل هذا العمل، إلا أن بناء النظام بيدك يوفر مرونة لا تُضاهى.