مقدمة إلى Policies و Gates في Laravel لتفويض الصلاحيات

Amine
30/08/2024

المقدمة

تُعد سياسات (Policies) وبوابات (Gates) Laravel أدوات قوية للتحكم في الوصول إلى الموارد المختلفة داخل تطبيقات Laravel. تسمح لك البوابات بتحديد منطق التفويض لإجراءات معينة، بينما توفر السياسات طريقة منظمة للتحكم في التفويض على مستوى النموذج (Model). باستخدام هذه الأدوات، يمكنك بسهولة إدارة وتحديد من يمكنه الوصول إلى وظائف معينة في تطبيقك، مثل تعديل أو حذف بيانات معينة.

الخطوة 1: إعداد بوابات (Gates) Laravel

البوابات هي وظائف مغلقة توفر طريقة بسيطة للتحقق مما إذا كان المستخدم مفوضًا لتنفيذ إجراء معين. يمكنك تعريف البوابات في ملف AuthServiceProvider.php الموجود في مجلد app/Providers:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Gate::define('edit-post', function ($user, $post) {
            return $user->id === $post->user_id;
        });
    }
}

في هذا المثال، نقوم بتعريف بوابة edit-post التي تتحقق مما إذا كان المستخدم هو صاحب المنشور. إذا كان user_id الخاص بالمستخدم يطابق user_id الخاص بالمنشور، سيتم السماح له بتعديل المنشور.

الخطوة 2: استخدام البوابات (Gates) في التطبيق

يمكنك استخدام البوابات في التطبيق للتحقق من الأذونات قبل تنفيذ الإجراءات. على سبيل المثال، يمكنك استخدام الدالة Gate::allows للتحقق مما إذا كان المستخدم مسموحًا له بتنفيذ الإجراء:

use Illuminate\Support\Facades\Gate;

if (Gate::allows('edit-post', $post)) {
    // المستخدم مسموح له بتعديل المنشور
} else {
    // المستخدم غير مسموح له بتعديل المنشور
}

يمكنك أيضًا استخدام الدالة @can في قوالب Blade لتحديد ما إذا كان ينبغي عرض عناصر واجهة المستخدم للمستخدم بناءً على الأذونات:

<!-- resources/views/posts/show.blade.php -->

@can('edit-post', $post)
    <a href="{{ route('posts.edit', $post) }}">تحرير المنشور</a>
@endcan

الخطوة 3: إنشاء سياسة (Policy) جديدة

السياسات توفر طريقة منظمة للتحكم في الوصول إلى الإجراءات المتعلقة بالنماذج (Models). لإنشاء سياسة جديدة، يمكنك استخدام الأمر make:policy. لنقم بإنشاء سياسة لإدارة التفويض على نموذج Post:

php artisan make:policy PostPolicy

سيتم إنشاء ملف PostPolicy.php في مجلد app/Policies. يحتوي هذا الملف على هيكل السياسة الافتراضي. يمكنك تخصيصه لتعريف منطق التفويض لمختلف الإجراءات:

<?php

namespace App\Policies;

use App\Models\Post;
use App\Models\User;

class PostPolicy
{
    /**
     * Determine if the given post can be updated by the user.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Post  $post
     * @return bool
     */
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }

    /**
     * Determine if the given post can be deleted by the user.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Post  $post
     * @return bool
     */
    public function delete(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}

في هذا المثال، نقوم بتعريف سياسات لتحديث وحذف المنشورات، مما يسمح فقط للمستخدم الذي يمتلك المنشور بتنفيذ هذه الإجراءات.

الخطوة 4: تسجيل السياسات (Policies)

لتفعيل السياسات، يجب عليك تسجيلها في ملف AuthServiceProvider.php:

<?php

namespace App\Providers;

use App\Models\Post;
use App\Policies\PostPolicy;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        Post::class => PostPolicy::class,
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
    }
}

تأكد من إضافة التعريف إلى مصفوفة $policies في AuthServiceProvider.

الخطوة 5: استخدام السياسات (Policies) في التطبيق

يمكنك استخدام السياسات في التطبيق للتحقق من الأذونات قبل تنفيذ الإجراءات، تمامًا مثل البوابات. على سبيل المثال، يمكنك استخدام الدالة authorize في المتحكم للتحقق مما إذا كان المستخدم مسموحًا له بتحديث المنشور:

use App\Models\Post;

public function update(Request $request, Post $post)
{
    $this->authorize('update', $post);

    // منطق تحديث المنشور
}

إذا لم يكن المستخدم مفوضًا لتحديث المنشور، سيتم إرجاع استجابة خطأ 403 (ممنوع).

الخطوة 6: استخدام السياسات في قوالب Blade

يمكنك أيضًا استخدام السياسات في قوالب Blade لتحديد ما إذا كان ينبغي عرض عناصر واجهة المستخدم للمستخدم بناءً على الأذونات:

<!-- resources/views/posts/show.blade.php -->

@can('update', $post)
    <a href="{{ route('posts.edit', $post) }}">تحرير المنشور</a>
@endcan

@can('delete', $post)
    <form action="{{ route('posts.destroy', $post) }}" method="POST">
        @csrf
        @method('DELETE')
        <button type="submit">حذف المنشور</button>
    </form>
@endcan

سيتم عرض روابط تحرير وحذف المنشورات فقط إذا كان المستخدم مفوضًا لتنفيذ هذه الإجراءات.

الخاتمة

تعد سياسات (Policies) وبوابات (Gates) Laravel أدوات قوية للتحكم في الوصول إلى الموارد في تطبيقاتك. من خلال استخدام هذه الأدوات، يمكنك تأمين تطبيقك والتحكم في الأذونات بناءً على أدوار المستخدمين أو أي معايير أخرى. استمر في استكشاف ميزات Laravel المختلفة لتعزيز تطبيقاتك وتحسين أدائها.

التعليقات

اترك تعليقاً