إدارة الصلاحيات (Authorization) باستخدام Gates و Policies
بعد أن يتأكد التطبيق من هوية المستخدم (Authentication)، يجب أن يقرر ما هي الأفعال المسموح له بالقيام بها (Authorization). فليس من المنطقي أن يقوم مستخدم عادي بحذف مقال كتبه مدير الموقع. في Laravel، نستخدم Gates للعمليات السريعة والبسيطة، و Policies للعمليات المرتبطة بنماذج معينة (Models)، مما يضمن أن كل فعل داخل تطبيقك محمي بقواعد أمنية صارمة.
1. استخدام البوابات (Gates)
البوابات هي "Closures" بسيطة تحدد ما إذا كان المستخدم يملك إذناً معيناً. يتم تعريفها غالباً في ملف AppServiceProvider.
AppServiceProvider.php
use Illuminate\Support\Facades\Gate;
public function boot(): void
{
Gate::define('access-admin', function (User $user) {
return $user->is_admin;
});
}
2. استخدام السياسات (Policies)
السياسات هي كلاسات تنظم منطق الصلاحيات حول نموذج معين. لإنشاء سياسة خاصة بالمقالات:
php artisan make:policy PostPolicy --model=Post
بداخلها، يمكنك تحديد من يملك صلاحية التعديل مثلاً:
public function update(User $user, Post $post): bool
{
// فقط صاحب المقال يمكنه تعديله
return $user->id === $post->user_id;
}
3. فحص الصلاحية في الكود و Blade
بمجرد تعريف الـ Gate أو Policy، يمكنك استخدامها بسهولة في أي مكان:
// في المتحكم
if ($request->user()->cannot('update', $post)) {
abort(403);
}
// في قوالب Blade
@can('update', $post)
@endcan
أسئلة شائعة حول الصلاحيات
استخدم **Gates** للأشياء العامة التي لا ترتبط بجدول في قاعدة البيانات (مثل دخول لوحة التحكم). واستخدم **Policies** لأي شيء يرتبط بجدول (مثل: حذف كتاب، تعديل تعليق، مشاهدة ملف مستخدم).
نعم، يمكنك استخدام وظيفة
Gate::before لتعريف مستخدم يملك صلاحيات مطلقة دائماً، مما يغنيك عن كتابة فحص "هل هو أدمن" في كل سياسة على حدة.
الدرس القادم
البرمجيات الوسيطة (Middleware)
تعلمنا كيف نحمي العمليات، الآن سنتعلم كيف نضع فلاتر على مستوى الطلبات بالكامل للتحكم في من يدخل إلى موقعنا ومن يتم تحويله لمكان آخر.
تعلم الـ Middleware