Benutzerauthentifizierung


Benutzerauthentifizierung

Einführung

{tip} Möchten Sie schnell loslegen? Führen Sie einfach php artisan make:auth und php artisan migrate in einer neuen Laravel-Anwendung aus. Navigieren Sie dann in Ihrem Browser zu http://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

Wenn der Weiterleitungspfad eine benutzerdefinierte Generierungslogik erfordert, können Sie die Methode

anstelle des Attributs redirectTo definieren: redirectTo

protected function redirectTo(){ 
   return '/path';
 }

{Tipp} Die Methode „redirectTo“ hat Vorrang vor das Attribut „redirectTo“.

Benutzerdefinierter Benutzername

Laravel 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

der Klasse

RegisterControllervalidator enthält die Regeln für die Validierung neuer Benutzer, und Sie können diese Methode nach Ihren Wünschen anpassen. Die

-Methode von

RegisterControllercreate 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

Zusätzliche Bedingungen angeben

Zusätzlich zur E-Mail-Adresse und dem Passwort des Benutzers können Sie der Authentifizierungsabfrage zusätzliche Bedingungen hinzufügen. Beispielsweise können wir überprüfen, ob der Benutzer als „aktiviert“ markiert wurde:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {  
  // 用户存在,已激活且未被禁用。
 }

{note} In diesen Beispielen ist

keine erforderliche Option, sondern dient nur zu Demonstrationszwecken. Sie sollten Spaltennamen verwenden, die dem „Benutzernamen“ in Ihrer Datenbank entsprechen. email

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 Methode

aufgerufen 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',    
     ],
  ],

Die

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',   
         ],
      ];
Dieser Artikel wurde zuerst auf der Website LearnKu.com veröffentlicht.