Structure interne du système d’authentification Laravel
La façade Auth et AuthManager
La façade Auth est un proxy vers Illuminate\Auth\AuthManager. AuthManager gère plusieurs guards suivant un pattern de driver et instancie/cache l’instance de guard appropriée en se basant sur la configuration de config/auth.php.
resolve() lit la clé driver dans le tableau guards de config/auth.php et invoque la closure de fabrique correspondante. Les drivers intégrés session et token sont enregistrés selon le même mécanisme.
Différence entre les interfaces Guard et StatefulGuard
Un guard d’authentification Laravel doit au minimum implémenter Illuminate\Contracts\Auth\Guard. S’il doit maintenir une session, il implémente StatefulGuard.
Interface Guard (Illuminate\Contracts\Auth\Guard)
Interface Guard (Illuminate\Contracts\Auth\Guard)
Interface StatefulGuard (Illuminate\Contracts\Auth\StatefulGuard)
Interface StatefulGuard (Illuminate\Contracts\Auth\StatefulGuard)
StatefulGuard hérite de Guard et ajoute les méthodes nécessaires pour maintenir l’état de connexion via session ou cookies.Guard. Si vous avez besoin de session (par exemple une connexion administrateur), implémentez StatefulGuard.Implémentation d’un guard personnalisé
Le trait GuardHelpers
Comme les méthodes check(), guest(), id(), hasUser() de l’interface Guard ont presque toujours la même implémentation, Laravel fournit le trait Illuminate\Auth\GuardHelpers. En l’utilisant, vous pouvez limiter les méthodes obligatoires à user() et validate().
Exemple d’implémentation d’un guard d’authentification par token API
En s’inspirant de la conception deTokenGuard, nous implémentons un guard d’authentification par token API simple. Il récupère le token depuis un en-tête de requête ou un paramètre de requête, puis résout l’utilisateur via un UserProvider.
Créer la classe de guard
app/Auth.Enregistrer le guard dans un service provider
Auth::extend() dans la méthode boot() de AppServiceProvider.Auth::createUserProvider() lit la configuration providers de config/auth.php et retourne l’instance de UserProvider correspondante. Sauf si vous créez un provider personnalisé, cet appel vous permet d’utiliser le EloquentUserProvider standard.Configurer le guard dans config/auth.php
config/auth.php.Appliquer le guard aux routes
auth.Auth::guard('api') ou auth('api').Guard simplifié via une closure
AvecAuth::viaRequest(), vous pouvez définir un guard simple avec juste une closure, sans créer de classe. Utile pour prototyper ou pour des authentifications très simples.
config/auth.php :
Implémentation d’un UserProvider personnalisé
Pour récupérer les informations utilisateur depuis une source autre que la base de données (API externe, LDAP, etc.), implémentez l’interface Illuminate\Contracts\Auth\UserProvider.
Enregistrement du UserProvider personnalisé
providers de config/auth.php :
Cas d’usage pratiques
Authentification multiple (guards séparés pour administrateurs et utilisateurs)
Créer le modèle Admin
Authenticatable permet l’intégration avec le système Auth.Configurer config/auth.php
Configurer les routes et middlewares
Écrire le processus de connexion en spécifiant le guard
Authentification API externe via token JWT
Exemple d’implémentation d’un guard personnalisé utilisant un service JWT externe.AppServiceProvider :
Tests
Pour les tests unitaires d’un guard personnalisé, moquez leUserProvider pour vérifier le comportement du guard.
ActingAs, vous pouvez définir un utilisateur sur un guard spécifique.