Alors que l'authentification vérifie qui est l'utilisateur, l'autorisation détermine ce qu'il a le droit de faire. Découvrez la complémentarité entre les Gates (règles globales) et les Policies (classes dédiées à la gestion des droits sur un modèle Eloquent).
Closures rapides déclarées dans AppServiceProvider pour autoriser des actions génériques (ex: accès au back-office admin).
Classes dédiées mappées à vos modèles Eloquent (ProductPolicy) pour contrôler qui peut voir, modifier ou supprimer un produit précis.
Dans Blade, conditionnez l'affichage des boutons d'édition avec @can('update', $product) sans code verbeux.
La méthode $this->authorize() bloque immédiatement les requêtes illégitimes avec une réponse HTTP 403 Forbidden.
// Commande Artisan : php artisan make:policy ProductPolicy --model=Product
// 1. app/Policies/ProductPolicy.php
namespace AppPolicies;
use AppModelsUser;
use AppModelsProduct;
class ProductPolicy
{
// Les administrateurs ont tous les droits automatiquement
public function before(User $user, string $ability): ?bool
{
if ($user->is_admin) {
return true;
}
return null; // Continue l'évaluation normale si non admin
}
// Seul l'auteur peut modifier son propre produit
public function update(User $user, Product $product): bool
{
return $user->id === $product->user_id;
}
// Seul l'auteur peut supprimer son produit
public function delete(User $user, Product $product): bool
{
return $user->id === $product->user_id;
}
}
// 2. app/Http/Controllers/ProductController.php
public function update(Request $request, Product $product)
{
// Vérifie l'autorisation. Déclenche une 403 Forbidden si faux !
$this->authorize('update', $product);
$product->update($request->validated());
return redirect()->route('products.show', $product);
}Changez le profil de l'utilisateur actif pour observer en direct comment la Policy calcule les autorisations sur un article appartenant à l'utilisateur #1 (Alice) et comment l'interface Blade s'adapte.
| Action | Règle Policy | Statut Autorisation | Code HTTP |
|---|---|---|---|
| view | Public pour tous | ✓ AUTORISÉ | 200 OK |
| update | $user->id === $product->user_id | ✓ AUTORISÉ | 200 OK |
| delete | Auteur ou Admin | ✓ AUTORISÉ | 200 OK |
Les Gates sont parfaites pour les actions globales indépendantes d'un modèle précis :
Gate::allows('admin-access'))Les Policies sont la norme pour toutes les actions CRUD associées à une ressource :
$post)$order)