Skip to main content

Differenza tra autenticazione e autorizzazione

L’autenticazione (Authentication) verifica “chi è” l’utente. Il login ne è l’esempio tipico. L’autorizzazione (Authorization) decide “cosa può fare” quell’utente. Ad esempio: modificare solo i propri post, solo gli amministratori possono modificare le impostazioni, ecc. Dopo aver implementato la funzione di login con l’autenticazione, il passo successivo è l’autorizzazione.
Le funzionalità di autorizzazione di Laravel offrono due approcci: Gate e Policy. Quale usare dipende dal caso d’uso.
Criteri di scelta

Gate

Le Gate sono verifiche di autorizzazione semplici basate su closure. Adatte a valutazioni di permessi non legate a un modello specifico.

Flusso di autorizzazione tramite Gate

Definire una Gate

Definisci le Gate nel metodo boot di App\Providers\AppServiceProvider con Gate::define().
La closure della Gate riceve sempre come primo argomento l’utente attualmente autenticato. Dal secondo argomento in poi passi eventuali informazioni aggiuntive come il modello di riferimento.

Verificare i permessi con una Gate

In un controller, per verificare i permessi con una Gate usa Gate::allows() o Gate::denies().

Lanciare eccezioni con Gate::authorize()

Per restituire automaticamente una risposta 403 in mancanza di permessi usa Gate::authorize(). Elimina la necessità di scrivere abort(403).
Gate::authorize() lancia una Illuminate\Auth\Access\AuthorizationException in mancanza di permessi. Laravel la converte automaticamente in una risposta HTTP 403.

Bypass amministratore (metodo before)

Se vuoi concedere tutti i permessi agli amministratori usa Gate::before().
Se la closure di before restituisce un valore diverso da null, quel valore diventa la decisione finale. Se restituisce null o niente, si procede alla valutazione normale della Gate.

@can / @cannot nei template Blade

Nei template le direttive @can e @cannot sono comode per usare le Gate.

Policy

Le Policy raccolgono in una classe la logica di autorizzazione relativa a un modello specifico. Per gestire i permessi CRUD sul modello Post, le Policy sono più adatte delle Gate.

Flusso di autorizzazione tramite Policy

Generare una Policy

Genera una classe Policy con il comando Artisan make:policy.
Per generare uno scheletro che include tutti i metodi CRUD corrispondenti a un modello, usa l’opzione --model.
Viene generato app/Policies/PostPolicy.php.

Rilevamento automatico di modelli e Policy

Di default Laravel rileva automaticamente le Policy secondo una convenzione di naming.
  • Modello: app/Models/Post.php
  • Policy: app/Policies/PostPolicy.php
Rispettando questa convenzione non è necessario registrare la Policy.
Se non segui la convenzione o vuoi registrarla manualmente, usa Gate::policy() nel metodo boot di AppServiceProvider.
In Laravel 13 puoi anche registrarla in modo dichiarativo con l’attribute #[UsePolicy] sul modello.

Implementare i metodi di una Policy

Una Policy generata con --model contiene i metodi corrispondenti alle azioni CRUD standard.

Bypass amministratore (metodo before)

Anche nelle Policy puoi definire un metodo before per concedere tutti i permessi agli amministratori.
Il metodo before viene invocato solo se la Policy contiene il metodo corrispondente. Se ad esempio manca update, before non viene chiamato.

Ordine di esecuzione della callback before

Usare le Policy nei controller

Metodo authorize()

I controller Laravel dispongono dell’helper authorize() (se non usi il controller base, usa Gate::authorize()).

Registrazione in blocco delle Policy RESTful con authorizeResource()

Chiamando authorizeResource() nel costruttore, i metodi della Policy corrispondenti alle azioni del controller vengono collegati automaticamente.
Corrispondenza tra azioni del controller e metodi della Policy:
Con authorizeResource() non devi scrivere authorize() in ogni azione. Comodo con i controller di risorsa RESTful.

Autorizzazione tramite middleware

Per effettuare il controllo di autorizzazione a livello di route usa il middleware can.
Scrittura più concisa con il metodo can:

Usare le Policy nei template Blade

Una volta registrate le Policy, anche @can / @cannot in Blade usano automaticamente le Policy.

Esempio pratico: gestione dei permessi degli articoli di blog

Esempio che implementa “solo l’autore può modificare e cancellare i propri articoli” in un’app blog.
1

Genera la Policy

2

Implementa i metodi della Policy

3

Aggiungi authorizeResource() al controller

4

Aggiungi i controlli di permesso nel template Blade

  • Gate: verifiche di permessi semplici non legate a un modello. Accesso alla dashboard admin, modifica di impostazioni globali, ecc.
  • Policy: gestione dei permessi CRUD su un modello. Crei una Policy per ciascuna risorsa (Post, Order, Comment, ecc.).
Ultima modifica il 13 luglio 2026