Laravel
Laravel 11 & 10 • Chapitre 4 : Fonctionnalités Avancées

Sécurité & Autorisations : Gates et Policies

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).

🚧
Gates (Globales)

Closures rapides déclarées dans AppServiceProvider pour autoriser des actions génériques (ex: accès au back-office admin).

📜
Policies (Modèles)

Classes dédiées mappées à vos modèles Eloquent (ProductPolicy) pour contrôler qui peut voir, modifier ou supprimer un produit précis.

👁️
Directives @can

Dans Blade, conditionnez l'affichage des boutons d'édition avec @can('update', $product) sans code verbeux.

⛔
Erreur 403 Automatique

La méthode $this->authorize() bloque immédiatement les requêtes illégitimes avec une réponse HTTP 403 Forbidden.

app/Policies/ProductPolicy.php & ProductController.php
// 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);
}

Simulateur Testeur d'Autorisations & Matrice de Droits Policy

Simulation des Rôles & Propriété

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.

👤 Profil Utilisateur Standard
ActionRègle PolicyStatut AutorisationCode HTTP
viewPublic pour tous✓ AUTORISÉ200 OK
update$user->id === $product->user_id ✓ AUTORISÉ 200 OK
deleteAuteur ou Admin ✓ AUTORISÉ 200 OK
Article : MacBook Air M3
Auteur : Alice (ID: 1) • 1 299 €
Quand utiliser une Gate ?

Les Gates sont parfaites pour les actions globales indépendantes d'un modèle précis :

  • • Accéder au dashboard d'administration (Gate::allows('admin-access'))
  • • Activer le mode maintenance
  • • Télécharger un rapport financier global
Quand utiliser une Policy ?

Les Policies sont la norme pour toutes les actions CRUD associées à une ressource :

  • • Modifier ou supprimer un article spécifique ($post)
  • • Valider ou rejeter une commande précise ($order)
  • • Découverte automatique sans configuration manuelle