JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

Home

كيف قمت ببناء نظام صلاحيات ديناميكي في Laravel باستخدام الجداول المرتبطة – بدون استخدام Spatie

 


✍️ المقدمة:

في أغلب المشاريع البرمجية، نحتاج إلى نظام صلاحيات يحدد ما يمكن للمستخدم فعله داخل التطبيق.
الكثير من المبرمجين يعتمدون على مكتبة جاهزة مثل [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 يعزز من فهمك للبنية العميقة للتطبيقات، ويساعدك على التحكم الكامل في من يمكنه فعل ماذا.
ورغم وجود مكتبات تسهل هذا العمل، إلا أن بناء النظام بيدك يوفر مرونة لا تُضاهى.

NameEmailMessage