مقالات علاء عامر

نقدم مجموعة شاملة من مقالات التعليمية الهامة في تطوير الويب لتحويل أفكارك إلى واقع رقمي

المصادقة والتفويض في Laravel: حماية شاملة للتطبيقات

Laravel 2026-01-01 علاء عامر

المصادقة والتفويض في 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']);
    }
}

💡 أفضل الممارسات الأمنية

  1. استخدم HTTPS دائماً في الإنتاج
  2. فعّل Rate Limiting لمنع الهجمات
  3. طبق Two-Factor Authentication للمديرين
  4. سجل جميع العمليات الحساسة لأغراض التدقيق
  5. استخدم Strong Password Policies
  6. طبق CSRF Protection على جميع النماذج
  7. راقب محاولات تسجيل الدخول المشبوهة

الخطوة التالية

تعلم API Development في Laravel لبناء واجهات برمجية قوية وآمنة.

📩 هل تحتاج مساعدة في تأمين تطبيق Laravel؟

Laravel Authentication Authorization Security Gates Policies Middleware JWT
قسم المقالة
Laravel

المصادقة والتفويض في Laravel: حماية شاملة للتطبيقات

دليل متكامل للمصادقة والتفويض في Laravel، من الإعداد الأساسي إلى الحماية المتقدمة مع أمثلة عملية شاملة.

المصادقة والتفويض في Laravel: حماية شاملة للتطبيقات
01

التواصل والاستشارة

تواصل مباشر عبر الواتساب أو الهاتف لفهم احتياجات مشروعك بدقة.

02

التخطيط والجدولة

وضع خطة عمل واضحة مع جدول زمني محدد لكل مرحلة من المشروع.

03

البرمجة والتطوير

تطوير المشروع بأحدث التقنيات لضمان الأداء والأمان العاليين.

04

المراجعة والتسليم

ختبار شامل ومراجعة دقيقة قبل التسليم النهائي للمشروع.

علاء عامر
علاء عامر

مطور ويب محترف بخبرة تزيد عن 10 سنوات في بناء حلول رقمية مبتكرة.

هل تحتاج هذه الخدمة؟

تواصل معي الآن للحصول على استشارة مجانية وعرض سعر

تواصل عبر واتساب رضاكم هو هدفنا الأسمى

عروض إضافية

  • صيانة وتحديث المواقع

    نحافظ على موقعك آمنًا ومحدّثًا دائمًا

  • ربط الأنظمة وواجهات البرمجة

    نربط أنظمتك بواجهات برمجية قوية ومرنة

  • تصميم وتحسين قواعد البيانات

    استعلامات أسرع وهيكلة أوضح وأخطاء أقل

  • تأمين المواقع والحماية المتقدمة

    حماية موقعك من التهديدات السيبرانية

  • أتمتة العمليات والمهام البرمجية

    نؤتمت المهام المتكررة ونوفّر وقتك دائمًا

لديك استفسار؟

اتصل بنا الآن

00201014714795

راسلنا عبر البريد الإلكتروني

[email protected]