مقدمة إلى Policies و Gates في Laravel لتفويض الصلاحيات
المقدمة
تُعد سياسات (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 المختلفة لتعزيز تطبيقاتك وتحسين أدائها.
اترك تعليقاً