Guards authenticate; Policies authorize.
Policies
php artisan make:policy PostPolicy --model=Post
Guards authenticate; Policies authorize.
php artisan make:policy PostPolicy --model=Post
class PostPolicy { public function update(User $user, Post $post) { return $user->id === $post->user_id; } public function delete(User $user, Post $post) { return $user->id === $post->user_id || $user->role === "admin"; } } Gate::define("admin", fn($user) => $user->role === "admin");
<?php // config/auth.php (custom student guard) "guards" => [ "student" => [ "driver" => "session", "provider" => "students", ], ], // app/Models/Post.php use Illuminate\Foundation\Auth\Access\Authorizable; // app/Policies/PostPolicy.php class PostPolicy { public function update(User $user, Post $post) { return $user->id === $post->user_id; } public function delete(User $user, Post $post) { return $user->id === $post->user_id || $user->is_admin; } } // Usage in controller $this->authorize("update", $post); if ($user->can("delete", $post)) { // allowed }
Create a policy allowing only owners to edit posts.
class PostPolicy {
public function update(User $user, Post $post) {
return $user->id === $post->user_id;
}
}
What does $this->authorize() do on failure?
Throws AuthorizationException (403).
Middleware controls route access (auth). Policies control authorization on specific model actions.