De interne structuur van het authenticatiesysteem van Laravel
De Auth-facade en de AuthManager
De Auth-facade is een proxy voor Illuminate\Auth\AuthManager. De AuthManager beheert meerdere guards volgens het driverpatroon en maakt en cachet de juiste guardinstanties op basis van de configuratie in config/auth.php.
resolve() leest de driver-sleutel uit de guards-array in config/auth.php en roept de bijbehorende factory-closure aan. Ook de ingebouwde drivers session en token zijn op deze manier geregistreerd.
Het verschil tussen de interfaces Guard en StatefulGuard
Een authenticatieguard van Laravel moet minimaal Illuminate\Contracts\Auth\Guard implementeren. Moet er een sessie worden bijgehouden, dan implementeer je StatefulGuard.
De Guard-interface (Illuminate\Contracts\Auth\Guard)
De Guard-interface (Illuminate\Contracts\Auth\Guard)
De StatefulGuard-interface (Illuminate\Contracts\Auth\StatefulGuard)
De StatefulGuard-interface (Illuminate\Contracts\Auth\StatefulGuard)
StatefulGuard erft van Guard en voegt de methodes toe die nodig zijn om de loginstatus via sessies en cookies te bewaren.Guards die geen sessie nodig hebben, zoals API-authenticatie of eigen tokenauthenticatie, hoeven alleen
Guard te implementeren. Is een sessie nodig, zoals bij een beheerderslogin, dan implementeer je StatefulGuard.Een custom guard implementeren
De GuardHelpers-trait
Omdat check(), guest(), id() en hasUser() van de Guard-interface vrijwel altijd dezelfde implementatie hebben, biedt Laravel de trait Illuminate\Auth\GuardHelpers. Met deze trait beperk je de verplichte implementatie tot twee methodes: user() en validate().
Implementatievoorbeeld: een API-tokenguard
Naar het voorbeeld van het ontwerp van deTokenGuard implementeren we een eenvoudige guard met API-tokenauthenticatie. De guard haalt het token uit de requestheader of queryparameter en resolvet de gebruiker via de UserProvider.
1
De guardklasse aanmaken
Maak de guardklasse aan in de map
app/Auth.2
De guard registreren in een service provider
Registreer de guard met
Auth::extend() in de boot()-methode van de AppServiceProvider.Auth::createUserProvider() leest de providers-configuratie in config/auth.php en geeft de bijbehorende UserProvider-instantie terug. Zolang je geen eigen provider maakt, gebruik je op deze manier de standaard EloquentUserProvider.3
De guard configureren in config/auth.php
Voeg de nieuwe guard toe aan
config/auth.php.4
De guard toepassen op routes
Geef de guardnaam op bij de Om in een controller of andere code een specifieke guard te gebruiken, roep je
auth-middleware.Auth::guard('api') of auth('api') aan.Een simpele guard met een closure
MetAuth::viaRequest() kun je zonder klasse, alleen met een closure, een eenvoudige guard definiëren. Geschikt voor prototypes of heel simpele authenticatie.
config/auth.php:
Een custom UserProvider implementeren
Wil je gebruikersgegevens uit een andere bron dan de database halen (een externe API, LDAP, enzovoort), dan implementeer je de interface Illuminate\Contracts\Auth\UserProvider.
De custom UserProvider registreren
providers-sectie van config/auth.php:
Praktische use cases
Multi-authenticatie (aparte guards voor beheerders en gewone gebruikers)
1
Het beheerdersmodel aanmaken
Maak een Eloquent-model voor beheerders. Door van
Authenticatable te erven, werkt het samen met het Auth-systeem.2
config/auth.php configureren
3
Routes en middleware instellen
4
De loginverwerking schrijven met een expliciete guard
Externe API-authenticatie met JWT-tokens
Een voorbeeldimplementatie van een custom guard wanneer je een externe JWT-authenticatiedienst gebruikt.AppServiceProvider:
Testen
In unittests van een custom guard mock je deUserProvider om het gedrag van de guard te controleren.
actingAs kun je een gebruiker instellen voor een specifieke guard.
Gerelateerde pagina’s
Authenticatie (introductie)
Bekijk de starter kits en de standaard authenticatieflows.
Service container
Begrijp de werking van de service container die je gebruikt bij het registreren van guards.