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

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

Accueil

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

 


✍️ المقدمة:

عندما تبدأ بتطوير تطبيق يحتوي على عدة أنواع من المستخدمين، ستحتاج بالتأكيد إلى نظام صلاحيات (Permissions & Roles).
غالبًا ما يلجأ المطورون مباشرة إلى مكتبة Spatie Laravel Permission, وهي رائعة… لكن، ماذا لو أردت بناء النظام بنفسك؟

في أحد مشاريعي قررت أن أبني نظام صلاحيات خاص بي بدون الاعتماد على أي مكتبة خارجية، والنتائج كانت تعليمية وممتعة جدًا.

في هذا المقال، سأشاركك الطريقة خطوة بخطوة لبناء نظام صلاحيات مخصص باستخدام Laravel فقط – وكيف تدير التحكم في الوصول بشكل آمن ومرن.

🎯 هدف النظام:

  • تعريف أدوار (Roles) مثل: admin, editor, user

  • تخصيص صلاحيات لكل دور

  • التحكم بالدخول إلى الصفحات والعمليات بناءً على الدور

  • تخزين الصلاحيات في قاعدة البيانات

🧱 قاعدة البيانات – التصميم:

1. جدول roles

Schema::create('roles', function (Blueprint $table) {
    $table->id();
    $table->string('name')->unique(); // مثل: admin, user
    $table->timestamps();
});

2. جدول permissions

Schema::create('permissions', function (Blueprint $table) {
    $table->id();
    $table->string('name')->unique(); // مثل: create_post, delete_user
    $table->timestamps();
});

3. جدول pivot بين roles و permissions

Schema::create('permission_role', function (Blueprint $table) {
    $table->foreignId('role_id')->constrained()->onDelete('cascade');
    $table->foreignId('permission_id')->constrained()->onDelete('cascade');
});

4. ربط المستخدم بالدور

Schema::table('users', function (Blueprint $table) {
    $table->foreignId('role_id')->nullable()->constrained()->onDelete('set null');
});

💻 تعريف العلاقات في الـ Models:

في User.php

public function role()
{
    return $this->belongsTo(Role::class);
}

public function hasPermission($permission)
{
    return $this->role && $this->role->permissions->contains('name', $permission);
}

في Role.php

public function permissions()
{
    return $this->belongsToMany(Permission::class);
}

🛡️ استخدام Gate لحماية العمليات:

في AuthServiceProvider.php

use Illuminate\Support\Facades\Gate;

public function boot()
{
    Gate::define('edit-post', function ($user) {
        return $user->hasPermission('edit_post');
    });
}

في Controller:

public function update(Post $post)
{
    if (Gate::denies('edit-post')) {
        abort(403);
    }

    // كود التعديل هنا
}

في Blade:

@can('edit-post')
    <button>تعديل المقال</button>
@endcan

✅ لماذا هذا النظام أفضل في بعض الحالات؟

(ميزة) (التوضيح)
(مرن جدًا) (يمكنك تصميمه حسب منطق مشروعك)
(لا يعتمد على مكتبات خارجية) (خفيف وسهل التخصيص)
(تعليمي) (يساعدك على فهم Laravel بعمق)
(قابل للتطوير) (يمكن ربطه بأنظمة API أو صلاحيات مؤقتة)

⚠️ مشاكل واجهتني وكيف حللتها:

❌ المشكلة:

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

✅ الحل:

استخدم onDelete('set null') في جدول users لتجنب الخطأ، وراقب المستخدمين اليتامى لاحقًا.

📌 نصيحة عملية:

لا تفرط في تعقيد الصلاحيات.
ابدأ بدورين أو ثلاثة فقط، وتوسع لاحقًا حسب الحاجة.

🧾 الخلاصة:

إنشاء نظام صلاحيات مخصص في Laravel بدون مكتبات خارجية هو تمرين ممتاز لأي مبرمج يرغب في فهم التحكم في الوصول والتحقق من الأذونات.

بخطوات بسيطة وتنظيم جيد، يمكنك بناء نظام قوي ومرن يفي بالغرض — ويجعلك أكثر سيطرة على مشروعك.


NomE-mailMessage