مقاله

Gate، Policy، authorize در Controller و Blade — تفاوت authentication و authorization با مثال Post و User.

Policy و Authorization در Laravel — کنترل دسترسی حرفه‌ای

Policy و Authorization در Laravel — کنترل دسترسی حرفه‌ای

login کردن یعنی «کی هستی» — authorization یعنی «چه کارهایی مجازی». اشتباه fatal: فقط middleware auth روی route admin بدون چک ownership — user A پست user B را edit می‌کند. Policy در Laravel پاسخ استاندارد است.

Authentication vs Authorization

  • Authentication: Breeze، Sanctum
  • Authorization: Policy، Gate، role (Spatie permission مقاله جدا)

ساخت Policy

php artisan make:policy PostPolicy --model=Post
class PostPolicy
{
    public function viewAny(User $user): bool
    {
        return true;
    }

    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id || $user->is_admin;
    }

    public function delete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }
}

Laravel auto-discover policy برای model اگر naming convention رعایت شود.

استفاده در Controller

public function update(UpdatePostRequest $request, Post $post)
{
    $this->authorize('update', $post);
    // ...
}

یا $request->user()->can('update', $post)

Route middleware

Route::put('/posts/{post}', [PostController::class, 'update'])
    ->middleware('can:update,post');

Blade

@can('update', $post)
  <a href="{{ route('posts.edit', $post) }}">ویرایش</a>
@endcan

Gate برای ability عمومی

Gate::define('manage-settings', fn (User $user) => $user->is_admin);

// استفاده
Gate::authorize('manage-settings');

برای resource-specific → Policy؛ برای global ability → Gate.

before — super admin

public function before(User $user, string $ability): ?bool
{
    if ($user->is_admin) {
        return true;
    }
    return null;
}

API و Policy

همان policy در API controller — 403 JSON خودکار با AuthorizationException.

اشتباهات

  • چک فقط در view نه controller — API دور زده می‌شود
  • is_admin hardcode everywhere
  • فراموش policy در Filament resource

اشتباهات مبتدی.

جمع‌بندی

هر action روی model → متد policy. معماری + 2FA برای امنیت لایه‌ای.

پنل چندنقشی