Policy و Authorization در Laravel — کنترل دسترسی حرفهای
login کردن یعنی «کی هستی» — authorization یعنی «چه کارهایی مجازی». اشتباه fatal: فقط middleware auth روی route admin بدون چک ownership — user A پست user B را edit میکند. Policy در Laravel پاسخ استاندارد است.
Authentication vs Authorization
ساخت 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 برای امنیت لایهای.