Benutzerauthentifizierung
Benutzerauthentifizierung
- Einführung
- Kurzanleitung zur Benutzerauthentifizierung
- Manuelle Überprüfung von Benutzern
- HTTP Basisauthentifizierung
- Abmelden
- Soziale Authentifizierung
- Benutzerdefinierten Schutz hinzufügen
- Benutzerdefinierten Benutzeranbieter hinzufügen
- Veranstaltungen
Einführung
{tip} Möchten Sie schnell loslegen? Führen Sie einfach
php artisan make:auth
undphp artisan migrate
in einer neuen Laravel-Anwendung aus. Navigieren Sie dann in Ihrem Browser zuhttp://your-app.test/register
oder einer anderen Ihrem Programm zugewiesenen URL. Diese beiden Befehle sind für den Aufbau des gesamten Authentifizierungssystems verantwortlich!
Laravel macht die Implementierung der Authentifizierung sehr einfach. Tatsächlich sind fast alle Konfigurationen vorgefertigt. Die Authentifizierungskonfigurationsdatei befindet sich unter config/auth.php
und enthält mehrere gut dokumentierte Optionen zum Anpassen des Verhaltens des Authentifizierungsdienstes.
Im Kern besteht die Authentifizierungsfunktion von Laravel aus „Guards“ und „Providers“. Der Wächter entscheidet, wie der Benutzer für jede Anfrage authentifiziert wird. Laravel verfügt beispielsweise über einen session
Guard, der Sitzungsspeicher und Cookies verwendet, um den Status aufrechtzuerhalten.
Der Anbieter entscheidet, wie der Benutzer aus dem persistenten Speicher abgerufen wird. Laravel unterstützt das Abrufen von Benutzern mithilfe von Eloquent und dem Datenbankabfrage-Builder. Es steht Ihnen jedoch frei, basierend auf den Anforderungen Ihrer Anwendung andere Anbieter zu definieren.
Wenn das für Sie verwirrend klingt, machen Sie sich keine Sorgen! Viele Anwendungen müssen die Standardauthentifizierungskonfiguration nie ändern.
Datenbanknotizen
Standardmäßig fügt Laravel ein AppUser
Eloquent-Modell in Ihr app
-Verzeichnis ein. Dieses Modell kann mit dem standardmäßigen Eloquent-Authentifizierungstreiber verwendet werden. Wenn Ihre Anwendung Eloquent nicht verwendet, können Sie den database
-Authentifizierungstreiber verwenden, der den Laravel-Abfrage-Builder verwendet.
Stellen Sie beim Generieren des Datenbankschemas für das AppUser
-Modell sicher, dass das Passwort mindestens 60 Zeichen lang ist. Es ist eine gute Wahl, die Standardzeichenfolgenlänge von 255 Zeichen beizubehalten.
Außerdem sollten Sie überprüfen, ob die Tabelle „users“ (oder eine entsprechende Tabelle) eine nullbare, 100 Zeichen lange remember_token
-Zeichenfolge enthält. Diese Spalte wird zum Speichern des Tokens verwendet, wenn der Benutzer beim Anmelden bei der Anwendung die Option „Angemeldet bleiben“ auswählt.
Kurzanleitung zur Benutzerauthentifizierung
Laravel wird mit mehreren vorgefertigten Authentifizierungscontrollern geliefert, die sich in AppHttpControllersAuth
befinden der Namensraum. RegisterController
verwaltet die Registrierung neuer Benutzer, LoginController
verwaltet die Authentifizierung, ForgotPasswordController
verwaltet den E-Mail-Link zum Zurücksetzen des Passworts und ResetPasswordController
enthält die Logik zum Zurücksetzen des Passworts. Jeder dieser Controller verwendet ein Attribut, um die erforderlichen Methoden zu enthalten. Für viele Anwendungen müssen Sie diese Controller überhaupt nicht modifizieren.
Routing
Laravel bietet eine schnelle Möglichkeit, alle für die Authentifizierung erforderlichen Routen und Ansichten mit einem einfachen Befehl einzurichten:
php artisan make:auth
Dieser Befehl sollte für neue Anwendungsprogramme verwendet werden und wird installiert Layoutansichten, Registrierungs- und Anmeldeansichten sowie Routen für alle Authentifizierungsendpunkte. Außerdem wird ein HomeController
generiert, um Post-Login-Anfragen für das Anwendungs-Dashboard zu bearbeiten.
{Tipp} Wenn für Ihre Anwendung keine Registrierung erforderlich ist, können Sie sie deaktivieren, indem Sie das neu erstellte
RegisterController
löschen und die Routendeklaration ändern:Auth::routes(['register' => false]);
.
Ansicht
Wie im vorherigen Abschnitt erwähnt, erstellt der Befehl php artisan make:auth
das erforderliche Zur Authentifizierung alle Ansichten und legen Sie sie im Verzeichnis resources/views/auth
ab. Der Befehl
make:auth
erstellt außerdem ein Verzeichnis resources/views/layouts
, das das Grundlayout der Anwendung enthält. Alle diese Ansichten verwenden das Bootstrap-CSS-Framework, Sie können sie jedoch jederzeit anpassen.
Authentifizierung
Nachdem nun die Routen und Ansichten für den Authentifizierungscontroller eingerichtet wurden, können Sie sich registrieren und Authentifizieren Sie neue Benutzer! Da der Controller bereits standardmäßig eine Authentifizierungslogik enthält, um die Existenz des Benutzers zu überprüfen und den Benutzer in der Datenbank zu speichern (implementiert durch Merkmale), können Sie jetzt im Browser auf die Anwendung zugreifen.
Benutzerdefinierter Pfad
Wenn der Benutzer erfolgreich authentifiziert wurde, wird er zum /home
URI weitergeleitet. Sie können das LoginController
-Attribut in den Controllern RegisterController
, ResetPasswordController
, VerificationController
und redirectTo
definieren, um den Umleitungsort nach der Validierung anzupassen:
protected $redirectTo = '/';
Als Nächstes sollten Sie die RedirectIfAuthenticated
-Methode ändern in der Middleware, um beim Umleiten des Benutzers auf einen neuen URI umzuleiten. handle
anstelle des Attributs redirectTo
definieren: redirectTo
protected function redirectTo(){ return '/path'; }
{Tipp} Die Methode „redirectTo“ hat Vorrang vor das Attribut „redirectTo“.Benutzerdefinierter BenutzernameLaravel verwendet standardmäßig das Feld
zur Authentifizierung. Wenn Sie andere Felder verwenden möchten, können Sie im email
-Controller eine LoginController
-Methode definieren: username
public function username(){ return 'username'; }
Passen Sie den Watcher an
Sie können auch den „Watcher“ für die Benutzerauthentifizierung und -registrierung anpassen. Um diese Funktionalität zu implementieren, muss die LoginController
-Methode in RegisterController
, ResetPasswordController
und guard
definiert werden. Diese Methode gibt eine Guard-Instanz zurück:
use Illuminate\Support\Facades\Auth;protected function guard(){ return Auth::guard('guard-name'); }
Benutzerdefinierte Überprüfung/Speicherung
Um die Formularfelder zu ändern, die neue Benutzer bei der Registrierung ausfüllen müssen, oder anzupassen Wie Sie neue Benutzer in der Datenbank speichern, können Sie in der Klasse RegisterController
ändern. Diese Klasse ist für die Validierung und Erstellung neuer Benutzer verantwortlich. Die Methode
RegisterController
validator
enthält die Regeln für die Validierung neuer Benutzer, und Sie können diese Methode nach Ihren Wünschen anpassen. Die
RegisterController
create
ist für die Erstellung eines neuen AppUser
-Datensatzes in der Datenbank mithilfe des Eloquent ORM verantwortlich. Sie können diese Methode an die Anforderungen der Datenbank anpassen.
Authentifizierte Benutzer abrufen
Sie können über die Auth
-Fassade auf authentifizierte Benutzer zugreifen:
use Illuminate\Support\Facades\Auth; // 获取当前通过认证的用户... $user = Auth::user(); // 获取当前通过认证的用户 ID... $id = Auth::id();
Alternativ können Sie über die Instanz IlluminateHttpRequest
auf den authentifizierten Benutzer zugreifen. Vergessen Sie nicht, dass die Typ-Hint-Klasse automatisch in Ihre Controller-Methode eingefügt wird:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ProfileController extends Controller{ /** * 更新用户资料。 * * @param Request $request * @return Response */ public function update(Request $request) { // $request->user() 返回一个认证用户实例... } }
Um festzustellen, ob der aktuelle Benutzer authentifiziert wurde
Sie können verwenden Auth
Facades check
-Methode zur Überprüfung, ob der Benutzer authentifiziert ist. Bei Authentifizierung wird true
zurückgegeben:
use Illuminate\Support\Facades\Auth; if (Auth::check()) { // 用户已经登录了... }
{Tipp} Obwohl es möglich ist, die
check
-Methode zu verwenden, um zu bestätigen, ob der Benutzer authentifiziert ist, bevor dem Benutzer der Zugriff auf bestimmte Routen gestattet wird /controllers wird in der Regel immer noch Middleware verwendet, um zu überprüfen, ob der Benutzer authentifiziert ist. Weitere Informationen finden Sie in der Dokumentation zum geschützten Routing.
Routing schützen
Routing-Middleware kann verwendet werden, um nur authentifizierten Benutzern den Zugriff auf ein bestimmtes Routing zu ermöglichen . Laravel wird mit einer auth
-Middleware geliefert, die in IlluminateAuthMiddlewareAuthenticate
definiert ist. Da diese Middleware bereits im HTTP-Kern registriert ist, müssen Sie diese Middleware nur an die Routendefinition anhängen:
Route::get('profile', function () { // 只有认证过的用户可以进入... })->middleware('auth');
Wenn Sie einen Controller verwenden, können Sie natürlich < im Konstruktor des Controllers 🎜> aufrufen um es direkt an die Routendefinition anzuhängen: middleware
public function __construct(){ $this->middleware('auth'); }
Nicht authentifizierte Benutzer umleiten
Wenn die auth
-Middleware einen nicht authentifizierten Benutzer erkennt, leitet sie den Benutzer zu einer benannten Route namens login
um.
Sie können dieses Verhalten ändern, indem Sie die Funktion app/Http/Middleware/Authenticate.php
in der Datei redirectTo
ändern:
/** * Get the path the user should be redirected to. * * @param \Illuminate\Http\Request $request * @return string */ protected function redirectTo($request){ return route('login'); }
Geben Sie den Beobachter an
Wenn Sie auth
eingeben Wenn einer Route Middleware hinzugefügt wird, kann diese auch angeben, welcher Watcher für die Benutzerauthentifizierung verwendet werden soll. Der angegebene Watcher sollte einem Schlüssel im Array auth.php
in der Konfigurationsdatei guards
entsprechen:
public function __construct(){ $this->middleware('auth:api'); }
Login current limit
Wenn Sie die integrierte Funktion von Laravel verwenden LoginController
Klasse, IlluminateFoundationAuthThrottlesLogins
-Eigenschaft ist bereits in diesem Controller enthalten. Wenn ein Benutzer nach mehreren Versuchen keine korrekten Anmeldeinformationen eingibt, kann er standardmäßig eine Minute lang keinen erneuten Anmeldeversuch unternehmen. Diese Drosselungsrichtlinie basiert auf der Einzigartigkeit des Benutzernamens/der E-Mail-Adresse eines Benutzers und seiner IP-Adresse.
Benutzer manuell authentifizieren
Es ist nicht erforderlich, einen Authentifizierungscontroller in Lavarel zu verwenden. Wenn Sie diese Controller entfernen möchten, müssen Sie die Lavarel-Validierungsklassen direkt verwenden. Keine Sorge, es ist ganz einfach!
kann mithilfe der Auth
-Fassade auf Laravel-Dienste zugreifen, daher müssen Sie Auth
zu Beginn des Kurses importieren. Werfen wir einen Blick auf die Methode attempt
: Jeder Parameter der Methode
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class LoginController extends Controller{ /** * 处理身份验证尝试。 * * @param \Illuminate\Http\Request $request * * @return Response */ public function authenticate(Request $request) { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials)) { // 身份验证通过... return redirect()->intended('dashboard'); } } }
attempt
ist ein assoziatives Array. Der Array-Wert wird verwendet, um den Benutzer in der Datenbank zu finden. Im obigen Beispiel werden Benutzer anhand des Werts der Spalte email
gefunden. Wenn der Benutzer gefunden wird, wird das in der Datenbank gespeicherte Hash-Passwort mit dem password
-Wert im Array verglichen. Es ist nicht erforderlich, das password
zu hashen. Das Framework hasht den Wert automatisch, bevor es ihn mit dem gehashten Passwort in der Datenbank vergleicht. Wenn die beiden Hashes übereinstimmen, wird eine authentifizierte Sitzung für den Benutzer aufgebaut.
Wenn die Überprüfung erfolgreich ist, gibt die attempt
-Methode true
zurück, andernfalls gibt sie false
zurück. Die Methode
in der Umleitung leitet den Benutzer zu der URL weiter, die vor der Authentifizierung über die Authentifizierungs-Middleware abgefangen wurde. Wenn das erwartete Ziel nicht vorhanden ist, können Sie einen Fallback-URI für diese Methode angeben. intended
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) { // 用户存在,已激活且未被禁用。 }
{note} In diesen Beispielen istkeine erforderliche Option, sondern dient nur zu Demonstrationszwecken. Sie sollten Spaltennamen verwenden, die dem „Benutzernamen“ in Ihrer Datenbank entsprechen.
Zugriff auf die angegebene Guard-Instanz
Sie können die Auth
-Methode der guard
-Fassade verwenden, um die Guard-Instanz anzugeben, die Sie verwenden möchten. Dadurch können Sie völlig unabhängige überprüfbare Modelle oder Benutzertabellen verwenden, um die Validierung für verschiedene Teile Ihrer Anwendung zu verwalten.
Der an die guard
-Methode übergebene Watcher-Name muss mit einem der Konfigurationselemente in der auth.php
-Konfiguration übereinstimmen:
if (Auth::guard('admin')->attempt($credentials)) { // }
Logout
Benutzer müssen sich mit der Auth
-Methode der logout
-Fassade abmelden. Dadurch werden die Benutzerauthentifizierungsinformationen in der Benutzersitzung gelöscht:
Auth::logout();
Benutzer merken
Wenn Sie möchten. Bereitstellen Wenn Sie die Funktion „An mich erinnern“ in der Anwendung verwenden möchten, können Sie attempt
angeben Die Methode übergibt einen booleschen Wert als zweiten Parameter, der den Benutzer auf unbestimmte Zeit authentifiziert hält, bis er sich manuell abmeldet. Die Benutzertabelle muss eine remember_token
-Spalte vom Typ String zum Speichern von Token enthalten.
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) { // 用户被记住... }
{Tipp} Wenn Sie Laravels integriertes
LoginController
verwenden, ist die richtige Logik zum „Erinnern“ an den Benutzer bereits durch die vom Controller verwendeten Merkmale implementiert.
Wenn „Benutzer speichern“ aktiviert ist, können Sie mit der Methode viaRemember
feststellen, ob das Cookie „Benutzer speichern“ verwendet wird Authentifizierung für Benutzer:
if (Auth::viaRemember()) { // }
Andere Authentifizierungsmethoden
Benutzerinstanz überprüfen
Wenn Sie einen vorhandenen Benutzer bei der Anwendung anmelden möchten, können Sie anrufen login
-Methode, die eine Benutzerinstanz als Parameter verwendet. Das Objekt muss den IlluminateContractsAuthAuthenticatable
-Vertrag implementieren. Das AppUser
-Modell, das mit Laravel geliefert wird, hat diese Schnittstelle implementiert:
Auth::login($user); // 登录并「记住」给定的用户... Auth::login($user, true);
Geben Sie die gewünschte Schutzinstanz mit der folgenden Methode an:
Auth::guard('admin')->login($user);
Benutzeridentität anhand der ID überprüfen
Sie können die Methode loginUsingId
verwenden, um einen Benutzer anhand seiner ID bei der Anwendung anzumelden. Diese Methode akzeptiert den Primärschlüssel des Benutzers, den Sie authentifizieren möchten:
Auth::loginUsingId(1); // 登录并「记住」给定用户... Auth::loginUsingId(1, true);
Authentifizierung des Benutzers nur einmal
Sie können die Methode once
verwenden, um den Benutzer zu protokollieren in Ihrer Bewerbung in einem einzigen Anfragecenter. Dadurch werden keine Sitzungen oder Cookies verwendet, was bedeutet, dass diese Methode beim Aufbau einer zustandslosen API hilft:
if (Auth::once($credentials)) { // }
HTTP-Basisauthentifizierung
HTTP-Basisauthentifizierung bietet eine schnelle Möglichkeit, Benutzer in Ihrer Anwendung zu authentifizieren, ohne eine spezielle „Anmeldeseite“ einzurichten. Bevor Sie beginnen, hängen Sie die auth.basic
-Middleware an Ihre Route an. auth.basic
Die Middleware ist bereits im Laravel-Framework enthalten, sodass Sie sie nicht definieren müssen:
Route::get('profile', function () { // 只有认证过的用户可以进入... })->middleware('auth.basic');
Nachdem Sie die Middleware an eine Route angehängt haben, werden Sie beim Zugriff auf diese Route automatisch zur Eingabe von Anmeldeinformationen aufgefordert ein Browser. Standardmäßig verwendet die auth.basic
-Middleware das Feld email
im Benutzerdatensatz als „Benutzername“.
FastCGI-Hinweise
Wenn Sie den PHP-FastCGI-Modus verwenden, funktioniert die HTTP-Basisauthentifizierung möglicherweise nicht ordnungsgemäß. Sie müssen die folgenden Zeilen zu Ihrer .htaccess
-Datei hinzufügen:
RewriteCond %{HTTP:Authorization} ^(.+)$ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Stateless HTTP Basic Authentication
You kann auch die HTTP-Basisauthentifizierung verwenden, ohne das Benutzer-ID-Cookie in der Sitzung zu setzen, was für die API nützlich ist Besonders nützlich ist die Authentifizierung. Definieren Sie dazu eine Middleware, die die Methode onceBasic
aufruft. Wenn die Methode onceBasic
keine Antwort zurückgibt, kann die Anfrage weiter an die Anwendung weitergeleitet werden:
<?php namespace App\Http\Middleware; use Illuminate\Support\Facades\Auth; class AuthenticateOnceWithBasicAuth{ /** * 处理传入的请求 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, $next) { return Auth::onceBasic() ?: $next($request); } }
Als nächstes registrieren Sie die Routing-Middleware und hängen Sie es an die Route an:
Route::get('api/user', function () { // 只有认证过的用户可以进入... })->middleware('auth.basic.once');
Abmelden
Um den Benutzer manuell aus der App abzumelden, müssen Sie Sie können die Auth
-Methode für die logout
-Fassade verwenden. Dadurch werden die Authentifizierungsinformationen in der Sitzung des Benutzers gelöscht:
use Illuminate\Support\Facades\Auth;Auth::logout();
Sitzung auf anderen Geräten ungültig machen
Laravel Also Bietet einen Mechanismus zum Ungültigmachen und „Abmelden“ von Benutzersitzungen auf anderen Geräten, ohne dass die aktuelle Sitzung unterbrochen wird Ungültig. Zuerst müssen Sie sicherstellen, dass sich die IlluminateSessionMiddlewareAuthenticateSession
-Middleware in der app/Http/Kernel.php
-Middleware-Gruppe in Ihrer web
-Klasse befindet und nicht auskommentiert ist:
'web' => [ // ... \Illuminate\Session\Middleware\AuthenticateSession::class, // ... ],
Dann können Sie die Auth
-Fassade < verwenden 🎜>Methode an. Bei dieser Methode muss der Benutzer sein aktuelles Passwort angeben, das Ihre Anwendung über das Eingabeformular akzeptieren sollte: logoutOtherDevices
use Illuminate\Support\Facades\Auth; Auth::logoutOtherDevices($password);
{note} Wenn die Methodeaufgerufen wird, werden die anderen Sitzungen des Benutzers vollständig gelöscht ungültig Dies bedeutet, dass sie alle Beobachter, bei denen sie zuvor authentifiziert wurden, „verlassen“ werden.
logoutOtherDevices
Benutzerdefinierten Beobachter hinzufügen
Sie können Ihren eigenen Authentifizierungsbeobachter mithilfe der Auth
-Methode der extend
-Fassade definieren. Sie sollten die Methode extend
im Dienstanbieter aufrufen. Da Laravel bereits mit AuthServiceProvider
geliefert wird, können wir den Code in diesen Anbieter einfügen:
<?php namespace App\Providers; use App\Services\Auth\JwtGuard; use Illuminate\Support\Facades\Auth; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider{ /** * 注册任意应用认证/授权服务。 * * @return void */ public function boot() { $this->registerPolicies(); Auth::extend('jwt', function ($app, $name, array $config) { // 返回一个 Illuminate\Contracts\Auth\Guard 实例... return new JwtGuard(Auth::createUserProvider($config['provider'])); }); }}
Wie Sie im obigen Beispiel sehen können, sollte der an die extend
-Methode übergebene Rückruf eine Instanz zurückgeben, die das implementiert IlluminateContractsAuthGuard
Schnittstelle. Diese Schnittstelle enthält einige Methoden, die Sie in Ihrem benutzerdefinierten Watcher implementieren müssen. Nachdem Ihr benutzerdefinierter Watcher definiert wurde, können Sie diesen Watcher in der auth.php
-Konfiguration der guards
-Konfigurationsdatei verwenden:
'guards' => [ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ],
Schließungsschutz anfordern
Implementierung basierend auf HTTP Der einfachste Weg, ein benutzerdefiniertes Authentifizierungssystem anzufordern, ist die Verwendung der Methode Auth::viaRequest
. Mit dieser Methode können Sie den Authentifizierungsprozess mithilfe eines einzigen Abschlusses schnell definieren.
Rufen Sie zunächst die Methode AuthServiceProvider
in der Methode boot
von Auth::viaRequest
auf. Die viaRequest
-Methode akzeptiert einen Watcher-Namen als ersten Parameter. Dieser Name kann eine beliebige Zeichenfolge sein, die Ihren benutzerdefinierten Watcher beschreibt. Der zweite an diese Methode übergebene Parameter sollte eine Abschlussfunktion sein, die die eingehende HTTP-Anfrage empfängt und eine Benutzerinstanz zurückgibt, oder, wenn die Validierung fehlschlägt, null
:
use App\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; /** * 注册任意应用认证/授权服务。 * * @return void */ public function boot(){ $this->registerPolicies(); Auth::viaRequest('custom-token', function ($request) { return User::where('token', $request->token)->first(); }); }
, wenn Sie nach Abschluss des benutzerdefinierten Watchers Folgendes tun Sie können die Datei im auth.php
konfigurieren Verwenden Sie diesen Schutz in der Konfiguration: guards
'guards' => [ 'api' => [ 'driver' => 'custom-token', ], ],Fügen Sie einen benutzerdefinierten Benutzeranbieter hinzu , wenn Sie keine herkömmlichen Beziehungen zum Speichern verwenden Um Benutzer in der Datenbank zu verwenden, müssen Sie Lavarel um Ihren eigenen Authentifizierungsbenutzeranbieter erweitern. Benutzeranbieter können mit der
-Methode der Auth
-Fassade angepasst werden: provider
<?php namespace App\Providers; use Illuminate\Support\Facades\Auth; use App\Extensions\RiakUserProvider; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider{ /** * 注册任意应用身份验证 / 授权服务Register any application authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Auth::provider('riak', function ($app, array $config) { // 返回 Illuminate\Contracts\Auth\UserProvider 实例... return new RiakUserProvider($app->make('riak.connection')); }); }}Nach der Registrierung mit der
-Methode können Sie in der provider
-Konfigurationsdatei zu einem neuen Benutzeranbieter wechseln. Definieren Sie zunächst einen auth.php
mit dem neuen Treiber: provider
'providers' => [ 'users' => [ 'driver' => 'riak', ], ],Dann können Sie diesen Anbieter in der
-Konfiguration verwenden: guards
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], ],
User Provider Contract
IlluminateContractsAuthUserProvider
-Implementierung ist nur dafür verantwortlich, die IlluminateContractsAuthAuthenticatable
-Implementierung aus persistenten Speichersystemen wie MySQL, Riak usw. abzurufen. Beide Schnittstellen ermöglichen, dass der Authentifizierungsmechanismus von Laravel weiterhin funktioniert, unabhängig davon, wie der Benutzer gespeichert ist und welcher Klassentyp zu seiner Darstellung verwendet wird:
Werfen wir einen Blick auf den IlluminateContractsAuthUserProvider
-Vertrag:
<?php namespace Illuminate\Contracts\Auth; interface UserProvider { public function retrieveById($identifier); public function retrieveByToken($identifier, $token); public function updateRememberToken(Authenticatable $user, $token); public function retrieveByCredentials(array $credentials); public function validateCredentials(Authenticatable $user, array $credentials); }
retrieveById
Die Funktion akzeptiert normalerweise den Schlüssel, der zur Darstellung der Klasse verwendet wird (z. B. die automatisch inkrementierte ID in der MySQL-Datenbank), als Parameter und ruft das Authenticatable
ab, das dieser ID entspricht, und gibt es zurück. erreichen. Die Funktion
retrieveByToken
erhält den Benutzer über sein eindeutiges $identifier
und das in der Spalte remember_token
gespeicherte „Remember Me“-Token. Wie die vorherige Methode gibt sie die Authenticatable
-Implementierung zurück. Die Methode
updateRememberToken
aktualisiert die Spalte $token
von $user
mit dem neuen remember_token
. Ein „Aktualisierungstoken“ wird zugewiesen, wenn die Anmeldeüberprüfung „Angemeldet bleiben“ erfolgreich ist oder wenn sich der Benutzer abmeldet.
Die retrieveByCredentials
-Methode akzeptiert eine Reihe von Anmeldeinformationen, die an die Auth::attempt
-Methode übergeben werden, wenn versucht wird, sich bei der App anzumelden. Diese Methode „fragt“ den zugrunde liegenden Persistenzspeicher nach Benutzern ab, die diesen Anmeldeinformationen entsprechen. Normalerweise führt diese Methode eine „Where“-Bedingung basierend auf $credentials['username']
aus, die eine Authenticatable
-Implementierung zurückgeben sollte. Diese Methode versucht keine Passwortüberprüfung oder Authentifizierung. Die
validateCredentials
-Methode sollte das angegebene $user
mit $credentials
vergleichen, um den Benutzer zu authentifizieren. Beispielsweise sollte diese Methode wahrscheinlich Hash::check
verwenden, um den Wert von $user->getAuthPassword()
mit dem Wert von $credentials['password']
zu vergleichen. Es sollte true
oder false
zurückgeben, um anzuzeigen, ob das Passwort des Benutzers gültig ist.
Authentifizierungsvertrag
Wir haben jede Methode von UserProvider
analysiert. Werfen wir einen Blick auf den Authenticatable
-Vertrag. Denken Sie daran, dass die Methoden retrieveById
, retrieveByToken
und retrieveByCredentials
des Benutzeranbieters Instanzen dieser Schnittstelle zurückgeben:
<?php namespace Illuminate\Contracts\Auth; interface Authenticatable { public function getAuthIdentifierName(); public function getAuthIdentifier(); public function getAuthPassword(); public function getRememberToken(); public function setRememberToken($value); public function getRememberTokenName(); }
Diese Schnittstelle ist einfach. Die getAuthIdentifierName
-Methode sollte den Namen der „Primärschlüssel“-Spalte des Benutzers zurückgeben, und die getAuthIdentifier
-Methode sollte den „Primärschlüssel“ des Benutzers zurückgeben. Im MySQL-Backend handelt es sich um einen automatisch inkrementierenden Primärschlüssel. getAuthPassword
Die Methode sollte das gehashte Passwort des Benutzers zurückgeben. Diese Schnittstelle ermöglicht es dem Authentifizierungssystem, immer mit jeder Benutzerklasse zu arbeiten, unabhängig davon, welche ORM- oder Abstraktionsspeicherschicht verwendet wird. Standardmäßig enthält das app
-Verzeichnis von Laravel eine User
-Klasse, die diese Schnittstelle implementiert. Sie können dieses Implementierungsbeispiel als Referenz verwenden.
Ereignisse
Laravel löst während des Authentifizierungsprozesses verschiedene Ereignisse aus. Zuhörer für diese Veranstaltungen können in EventServiceProvider
angehängt werden:
/** * 应用的事件监听器映射。 * * @var array */ protected $listen = [ 'Illuminate\Auth\Events\Registered' => [ 'App\Listeners\LogRegisteredUser', ], 'Illuminate\Auth\Events\Attempting' => [ 'App\Listeners\LogAuthenticationAttempt', ], 'Illuminate\Auth\Events\Authenticated' => [ 'App\Listeners\LogAuthenticated', ], 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LogSuccessfulLogin', ], 'Illuminate\Auth\Events\Failed' => [ 'App\Listeners\LogFailedLogin', ], 'Illuminate\Auth\Events\Logout' => [ 'App\Listeners\LogSuccessfulLogout', ], 'Illuminate\Auth\Events\Lockout' => [ 'App\Listeners\LogLockout', ], 'Illuminate\Auth\Events\PasswordReset' => [ 'App\Listeners\LogPasswordReset', ], ];