المصادقة والتفويض في Laravel: حماية شاملة للتطبيقات
المصادقة والتفويض في Laravel: حماية شاملة للتطبيقات
دليل تخصصي من علاء عامر – مطور ومصمم مواقع وتطبيقات محترف
الأمان في Laravel ليس مجرد ميزة إضافية، بل ضرورة أساسية. تعلم كيفية حماية تطبيقك بأحدث المعايير والممارسات.
2️⃣ إنشاء نظام الأدوار والصلاحيات
نماذج Role و Permission:
<?php
// app/Models/Role.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
protected $fillable = ['name', 'display_name', 'description', 'level'];
public function users()
{
return $this->belongsToMany(User::class)->withTimestamps();
}
public function permissions()
{
return $this->belongsToMany(Permission::class)->withTimestamps();
}
public function hasPermission($permission)
{
return $this->permissions->contains('name', $permission);
}
public function givePermissionTo($permission)
{
if (is_string($permission)) {
$permission = Permission::whereName($permission)->firstOrFail();
}
return $this->permissions()->syncWithoutDetaching($permission);
}
public function revokePermissionTo($permission)
{
if (is_string($permission)) {
$permission = Permission::whereName($permission)->firstOrFail();
}
return $this->permissions()->detach($permission);
}
}
// app/Models/Permission.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Permission extends Model
{
protected $fillable = ['name', 'display_name', 'description', 'group'];
public function roles()
{
return $this->belongsToMany(Role::class)->withTimestamps();
}
public function users()
{
return $this->belongsToMany(User::class)->withTimestamps();
}
}
Seeder للأدوار والصلاحيات:
<?php
// database/seeders/RolesAndPermissionsSeeder.php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Role;
use App\Models\Permission;
class RolesAndPermissionsSeeder extends Seeder
{
public function run()
{
// إنشاء الصلاحيات
$permissions = [
// Posts
['name' => 'view-posts', 'display_name' => 'عرض المقالات', 'group' => 'posts'],
['name' => 'create-posts', 'display_name' => 'إنشاء مقالات', 'group' => 'posts'],
['name' => 'edit-posts', 'display_name' => 'تحرير المقالات', 'group' => 'posts'],
['name' => 'delete-posts', 'display_name' => 'حذف المقالات', 'group' => 'posts'],
['name' => 'publish-posts', 'display_name' => 'نشر المقالات', 'group' => 'posts'],
// Users
['name' => 'view-users', 'display_name' => 'عرض المستخدمين', 'group' => 'users'],
['name' => 'create-users', 'display_name' => 'إنشاء مستخدمين', 'group' => 'users'],
['name' => 'edit-users', 'display_name' => 'تحرير المستخدمين', 'group' => 'users'],
['name' => 'delete-users', 'display_name' => 'حذف المستخدمين', 'group' => 'users'],
['name' => 'manage-roles', 'display_name' => 'إدارة الأدوار', 'group' => 'users'],
// Settings
['name' => 'view-settings', 'display_name' => 'عرض الإعدادات', 'group' => 'settings'],
['name' => 'edit-settings', 'display_name' => 'تحرير الإعدادات', 'group' => 'settings'],
['name' => 'view-analytics', 'display_name' => 'عرض الإحصائيات', 'group' => 'analytics'],
];
foreach ($permissions as $permission) {
Permission::firstOrCreate(['name' => $permission['name']], $permission);
}
// إنشاء الأدوار
$roles = [
[
'name' => 'super-admin',
'display_name' => 'المدير الأعلى',
'description' => 'صلاحيات كاملة لجميع أجزاء النظام',
'level' => 100
],
[
'name' => 'admin',
'display_name' => 'مدير',
'description' => 'صلاحيات إدارية عامة',
'level' => 80
],
[
'name' => 'editor',
'display_name' => 'محرر',
'description' => 'إدارة المحتوى والمقالات',
'level' => 60
],
[
'name' => 'author',
'display_name' => 'كاتب',
'description' => 'كتابة وتحرير المقالات الخاصة',
'level' => 40
],
[
'name' => 'user',
'display_name' => 'مستخدم',
'description' => 'مستخدم عادي',
'level' => 20
]
];
foreach ($roles as $roleData) {
$role = Role::firstOrCreate(['name' => $roleData['name']], $roleData);
// تخصيص صلاحيات لكل دور
switch ($roleData['name']) {
case 'super-admin':
$role->permissions()->sync(Permission::all());
break;
case 'admin':
$adminPermissions = Permission::whereIn('name', [
'view-posts', 'create-posts', 'edit-posts', 'delete-posts', 'publish-posts',
'view-users', 'create-users', 'edit-users',
'view-settings', 'edit-settings', 'view-analytics'
])->get();
$role->permissions()->sync($adminPermissions);
break;
case 'editor':
$editorPermissions = Permission::whereIn('name', [
'view-posts', 'create-posts', 'edit-posts', 'delete-posts', 'publish-posts',
'view-users', 'view-analytics'
])->get();
$role->permissions()->sync($editorPermissions);
break;
case 'author':
$authorPermissions = Permission::whereIn('name', [
'view-posts', 'create-posts', 'edit-posts'
])->get();
$role->permissions()->sync($authorPermissions);
break;
case 'user':
$userPermissions = Permission::whereIn('name', [
'view-posts'
])->get();
$role->permissions()->sync($userPermissions);
break;
}
}
// إنشاء مستخدم super admin
$superAdmin = \App\Models\User::firstOrCreate(
['email' => '[email protected]'],
[
'name' => 'Super Admin',
'password' => bcrypt('password'),
'email_verified_at' => now(),
'status' => 'active'
]
);
$superAdmin->assignRole('super-admin');
}
}
4️⃣ Gates و Policies للتحكم الدقيق
تعريف Gates:
<?php
// app/Providers/AuthServiceProvider.php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use App\Models\Post;
use App\Models\User;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Post::class => PostPolicy::class,
User::class => UserPolicy::class,
];
public function boot()
{
$this->registerPolicies();
// Gate للمديرين فقط
Gate::define('access-admin-panel', function (User $user) {
return $user->hasAnyRole(['admin', 'super-admin']);
});
// Gate للإحصائيات
Gate::define('view-analytics', function (User $user) {
return $user->hasPermission('view-analytics');
});
// Gate للمحتوى المدفوع
Gate::define('access-premium-content', function (User $user) {
return $user->subscription_status === 'active' || $user->hasRole('admin');
});
// Gate مع معاملات
Gate::define('edit-post', function (User $user, Post $post) {
// المؤلف يمكنه التحرير دائماً
if ($user->id === $post->user_id) {
return true;
}
// المحررين يمكنهم تحرير المقالات غير المنشورة
if ($user->hasRole('editor') && $post->status !== 'published') {
return true;
}
// المديرين يمكنهم تحرير أي شيء
return $user->hasRole('admin');
});
// Gate للموارد المحمية
Gate::define('download-resource', function (User $user, $resource) {
return $user->hasPermission('download-resources') &&
$user->subscription_status === 'active';
});
// Super Admin Gate
Gate::before(function (User $user, $ability) {
if ($user->hasRole('super-admin')) {
return true;
}
});
}
}
إنشاء Policy متقدم:
<?php
// app/Policies/PostPolicy.php
namespace App\Policies;
use App\Models\Post;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class PostPolicy
{
use HandlesAuthorization;
public function viewAny(User $user)
{
return $user->hasPermission('view-posts');
}
public function view(?User $user, Post $post)
{
// المقالات المنشورة متاحة للجميع
if ($post->status === 'published') {
return true;
}
// غير مسجل الدخول لا يمكنه رؤية المسودات
if (!$user) {
return false;
}
// المؤلف يمكنه رؤية مقاله
if ($user->id === $post->user_id) {
return true;
}
// المحررين والمديرين يمكنهم رؤية المسودات
return $user->hasAnyRole(['editor', 'admin']);
}
public function create(User $user)
{
return $user->hasPermission('create-posts') && $user->status === 'active';
}
public function update(User $user, Post $post)
{
// المؤلف يمكنه التحرير
if ($user->id === $post->user_id && $user->hasPermission('edit-posts')) {
return true;
}
// المحررين يمكنهم تحرير المقالات غير المنشورة فقط
if ($user->hasRole('editor') && $post->status !== 'published') {
return true;
}
// المديرين يمكنهم تحرير أي مقال
return $user->hasRole('admin');
}
public function delete(User $user, Post $post)
{
// المؤلف يمكنه حذف مقاله إذا لم ينشر
if ($user->id === $post->user_id && $post->status === 'draft') {
return $user->hasPermission('delete-posts');
}
// المديرين فقط يمكنهم حذف المقالات المنشورة
return $user->hasRole('admin');
}
public function publish(User $user, Post $post)
{
return $user->hasPermission('publish-posts') &&
($user->id === $post->user_id || $user->hasRole('editor'));
}
public function feature(User $user, Post $post)
{
return $user->hasAnyRole(['editor', 'admin']);
}
}
💡 أفضل الممارسات الأمنية
- استخدم HTTPS دائماً في الإنتاج
- فعّل Rate Limiting لمنع الهجمات
- طبق Two-Factor Authentication للمديرين
- سجل جميع العمليات الحساسة لأغراض التدقيق
- استخدم Strong Password Policies
- طبق CSRF Protection على جميع النماذج
- راقب محاولات تسجيل الدخول المشبوهة
الخطوة التالية
تعلم API Development في Laravel لبناء واجهات برمجية قوية وآمنة.
📩 هل تحتاج مساعدة في تأمين تطبيق Laravel؟
قسم المقالة
المصادقة والتفويض في Laravel: حماية شاملة للتطبيقات
دليل متكامل للمصادقة والتفويض في Laravel، من الإعداد الأساسي إلى الحماية المتقدمة مع أمثلة عملية شاملة.
التواصل والاستشارة
تواصل مباشر عبر الواتساب أو الهاتف لفهم احتياجات مشروعك بدقة.
التخطيط والجدولة
وضع خطة عمل واضحة مع جدول زمني محدد لكل مرحلة من المشروع.
البرمجة والتطوير
تطوير المشروع بأحدث التقنيات لضمان الأداء والأمان العاليين.
المراجعة والتسليم
ختبار شامل ومراجعة دقيقة قبل التسليم النهائي للمشروع.