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.
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 metodoboot di App\Providers\AppServiceProvider con Gate::define().
Verificare i permessi con una Gate
In un controller, per verificare i permessi con una Gate usaGate::allows() o Gate::denies().
Lanciare eccezioni con Gate::authorize()
Per restituire automaticamente una risposta 403 in mancanza di permessi usaGate::authorize(). Elimina la necessità di scrivere abort(403).
Bypass amministratore (metodo before)
Se vuoi concedere tutti i permessi agli amministratori usaGate::before().
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 modelloPost, le Policy sono più adatte delle Gate.
Flusso di autorizzazione tramite Policy
Generare una Policy
Genera una classe Policy con il comando Artisanmake:policy.
--model.
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
Se non segui la convenzione o vuoi registrarla manualmente, usa In Laravel 13 puoi anche registrarla in modo dichiarativo con l’attribute
Gate::policy() nel metodo boot di AppServiceProvider.#[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 metodobefore per concedere tutti i permessi agli amministratori.
Ordine di esecuzione della callback before
Usare le Policy nei controller
Metodo authorize()
I controller Laravel dispongono dell’helperauthorize() (se non usi il controller base, usa Gate::authorize()).
- User::can() / cannot()
Registrazione in blocco delle Policy RESTful con authorizeResource()
ChiamandoauthorizeResource() nel costruttore, i metodi della Policy corrispondenti alle azioni del controller vengono collegati automaticamente.
Autorizzazione tramite middleware
Per effettuare il controllo di autorizzazione a livello di route usa il middlewarecan.
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
Riepilogo
Come scegliere tra Gate e Policy
Come scegliere tra Gate e Policy
- 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.).
Riepilogo delle API più usate
Riepilogo delle API più usate
Comandi Artisan più usati
Comandi Artisan più usati