Struttura interna del sistema di autenticazione di Laravel
Facade Auth e AuthManager
La facade Auth è un proxy verso Illuminate\Auth\AuthManager. AuthManager gestisce più guard con il driver pattern e, in base alla configurazione di config/auth.php, crea e memorizza in cache la corretta istanza del guard.
resolve() legge la chiave driver dall’array guards di config/auth.php e chiama la closure factory corrispondente. Anche i driver integrati session e token sono registrati con lo stesso meccanismo.
Differenza tra l’interfaccia Guard e StatefulGuard
Un guard di autenticazione Laravel deve implementare almeno Illuminate\Contracts\Auth\Guard. Se serve mantenere una sessione, implementa StatefulGuard.
Interfaccia Guard (Illuminate\Contracts\Auth\Guard)
Interfaccia Guard (Illuminate\Contracts\Auth\Guard)
Interfaccia StatefulGuard (Illuminate\Contracts\Auth\StatefulGuard)
Interfaccia StatefulGuard (Illuminate\Contracts\Auth\StatefulGuard)
StatefulGuard estende Guard e aggiunge i metodi necessari a mantenere lo stato di login tramite sessione o cookie.Per un guard che non richiede sessione (autenticazione API, autenticazione con token personalizzato, ecc.) è sufficiente implementare
Guard. Se ti serve una sessione — come il login amministratore — implementa StatefulGuard.Implementazione di un guard personalizzato
Trait GuardHelpers
Poiché check(), guest(), id() e hasUser() di Guard hanno un’implementazione quasi identica, Laravel fornisce il trait Illuminate\Auth\GuardHelpers. Con questo trait devi implementare solo user() e validate().
Esempio: guard di autenticazione tramite API token
Ispirandoci al design diTokenGuard, implementiamo un semplice guard di autenticazione con API token. Recupera il token dagli header o dai parametri della richiesta e risolve l’utente tramite UserProvider.
1
Creare la classe guard
Crea la classe guard nella directory
app/Auth.2
Registrare il guard nel service provider
Nel metodo
boot() di AppServiceProvider registra il guard con Auth::extend().Auth::createUserProvider() legge la configurazione providers di config/auth.php e restituisce l’istanza UserProvider corrispondente. Finché non crei un provider personalizzato, con questa chiamata usi l’EloquentUserProvider standard.3
Configurare il guard in config/auth.php
Aggiungi il nuovo guard a
config/auth.php.4
Applicare il guard alle rotte
Nel middleware Per usare un guard specifico in un controller o nel codice, chiami
auth indichi il nome del guard.Auth::guard('api') o auth('api').Guard rapido con closure
ConAuth::viaRequest() puoi definire un guard semplice usando solo una closure, senza creare una classe. Adatto a prototipi o ad autenticazioni molto semplici.
config/auth.php:
Implementare un UserProvider personalizzato
Se recuperi le informazioni utente da una sorgente diversa dal DB (API esterne, LDAP, ecc.) implementa l’interfaccia Illuminate\Contracts\Auth\UserProvider.
Registrazione di un UserProvider personalizzato
providers in config/auth.php:
Casi d’uso pratici
Multi-authentication (guard separati per admin e utente)
1
Creare il modello Admin
Prepara un modello Eloquent per gli amministratori. Estendendo
Authenticatable si integra con il sistema Auth.2
Configurare config/auth.php
3
Impostare rotte e middleware
4
Scrivere il login indicando il guard
Autenticazione API esterna con JWT
Esempio di guard personalizzato che usa un servizio esterno di autenticazione JWT.AppServiceProvider:
Test
Nei test unitari di un guard personalizzato, mockiUserProvider e verifichi il comportamento del guard.
ActingAs puoi autenticare un utente su un guard specifico.
Pagine correlate
Autenticazione (introduzione)
Rivedi gli starter kit e il flusso di autenticazione standard.
Service container
Comprendi il meccanismo del service container usato per registrare i guard.