Heim >Backend-Entwicklung >PHP-Tutorial >So erstellen Sie einen benutzerdefinierten Authentifizierungsschutz in Laravel

So erstellen Sie einen benutzerdefinierten Authentifizierungsschutz in Laravel

Lisa Kudrow
Lisa KudrowOriginal
2025-03-05 10:02:09700Durchsuche

How to Create a Custom Authentication Guard in Laravel

In diesem Artikel wird das Authentifizierungssystem des Laravel -Frameworks eingehend untersucht und sich darauf konzentrieren, wie ein benutzerdefinierter Authentifizierungsschutz erstellt wird, indem das Kernauthentifizierungssystem erweitert wird.

Der Kern von

Laravel bietet ein leistungsstarkes Authentifizierungssystem, mit dem die grundlegende Authentifizierung einfach implementiert werden kann. Führen Sie einfach ein paar handwerkliche Befehle aus, um das Gerüst des Authentifizierungssystems aufzubauen.

Zusätzlich ist das System so konzipiert, dass sie eine Erweiterung und Einführung benutzerdefinierter Authentifizierungsadapter ermöglicht. In diesem Artikel wird dies ausführlich erläutert. Bevor wir uns mit der Implementierung von benutzerdefinierten Authentifizierungswächtern befassen, werden wir zunächst die Grundelemente des Laravel -Authentifizierungssystems - Guards und Anbieter - diskutieren.

Kernelemente: Wache und Anbieter

Der Kern des Laravel -Authentifizierungssystems besteht aus zwei Elementen - der Wache und dem Anbieter.

Wache

Wachen können als logische Anbieter verstanden werden, die zur Identifizierung authentifizierter Benutzer verwendet werden. Der Laravel -Kern bietet verschiedene Wachen wie Sitzung und Token. Der Session Guard verwaltet den Benutzerstatus in jeder Anfrage über Cookies, während der Token Guard den Benutzer authentifiziert, indem er das gültige Token in jeder Anfrage überprüft.

Daher definiert die Wache die Logik der Authentifizierung und wird nicht immer implementiert, indem gültige Anmeldeinformationen aus dem Backend abgerufen werden. Sie können einen Wachmann implementieren, der einfach nach bestimmten Inhalten im Anforderungsheader überprüft und den Benutzer basierend auf diesem Inhalt authentifiziert.

Eine Wache wird später in diesem Artikel implementiert, wodurch bestimmte JSON -Parameter im Anforderungsheader überprüft und gültige Benutzer aus dem MongoDB -Backend abgerufen werden.

Anbieter

Wenn der Wache die Logik für die Authentifizierung definiert, ist der Authentifizierungsanbieter dafür verantwortlich, Benutzer aus dem Backend -Speicher abzurufen. Wenn der Wache verlangt, dass der Benutzer mit dem Backend -Speicher authentifiziert werden muss, ist die Implementierung des Suchbenutzers im Authentifizierungsanbieter enthalten.

Laravel verfügt über zwei Standardauthentifizierungsanbieter - Datenbank und eloquent. Datenbankauthentifizierungsanbieter rufen Benutzeranmeldeinformationen direkt aus dem Backend -Speicher ab, während Eloquent eine Abstraktionsschicht dazu bietet.

In unserem Beispiel werden wir einen MongoDB -Authentifizierungsanbieter implementieren, der Benutzeranmeldeinformationen aus dem MongoDB -Backend holt.

Das obige ist eine grundlegende Einführung in die Wachen und Anbieter im Laravel -Authentifizierungssystem. Ab dem nächsten Abschnitt konzentrieren wir uns auf die Entwicklung von benutzerdefinierten Authentifizierungswächtern und Anbietern!

Dateieinstellungen Übersicht

Schauen wir uns einen kurzen Blick auf die Liste der Dateien, die in diesem Artikel implementiert werden sollen.

  • config/auth.php : Dies ist die Authentifizierungskonfigurationsdatei, in der wir den Eintrag für den benutzerdefinierten Schutz hinzufügen.
  • config/mongo.php : Datei mit MongoDB -Konfiguration.
  • App/Dienste/Verträge/NoSQLServiceInterface.php : Schnittstelle, die von unserer benutzerdefinierten Mongo -Datenbankklasse implementiert wurde.
  • App/Datenbank/mongodatabase.php : Die Hauptdatenbankklasse, die mit MongoDB interagiert.
  • app/models/auth/user.php : Benutzermodellklasse, die den authentierbaren Vertrag implementiert.
  • app/extensions/mongouserProvider.php : Implementierung von Authentifizierungsanbietern.
  • app/dienste/auth/jsonguard.php : Implementierung des Authentifizierungsschutz -Treibers.
  • App/Anbieter/AuthServiceProvider.php : Wir werden vorhandene Dateien zum Service -Container hinzufügen.
  • app/http/Controller/mongocontroller.php : Die Demo -Controller -Datei, die wir implementieren, um benutzerdefinierte Wachen zu testen.

Wenn die Dateiliste momentan nicht klar ist, machen Sie sich keine Sorgen, wir werden jede Datei während der Erläuterung ausführlich besprechen.

eingehende Implementierung

In diesem Abschnitt werden wir die Implementierung der erforderlichen Dateien nach und nach erläutern.

Zunächst müssen wir Laravel über unsere Sonderwächter informieren. Bitte fügen Sie die Details des benutzerdefinierten Schutzes in der Datei config/auth.php hinzu, wie unten gezeigt.

<code>...<br>...<br>'guards' => [<br>    'web' => [<br>        'driver' => 'session',<br>        'provider' => 'users',<br>    ],<br><br>    'api' => [<br>        'driver' => 'token',<br>        'provider' => 'users',<br>        'hash' => false,<br>    ],<br><br>    'custom' => [<br>      'driver' => 'json',<br>      'provider' => 'mongo',<br>    ],<br>],<br>...<br>...<br></code>

Wie Sie sehen, haben wir unsere benutzerdefinierte Wache im Abschnitt der Anbieter hinzugefügt.

<code>...<br>...<br>'providers' => [<br>    'users' => [<br>        'driver' => 'eloquent',<br>        'model' => App\User::class,<br>    ],<br>    'mongo' => [<br>        'driver' => 'mongo'<br>    ],<br><br>    // 'users' => [<br>    //     'driver' => 'database',<br>    //     'table' => 'users',<br>    // ],<br>],<br>...<br>...<br></code>

Wir haben unseren Anbietereintrag zum Benutzermodell im Web hinzugefügt.

Gemäß den Standards des Authentifizierungssystems müssen wir das Benutzermodell implementieren.

Stellen Sie den Authentifizierungsanbieter

fest

Wie bereits erwähnt, besteht das Laravel -Authentifizierungssystem aus zwei Elementen - der Wache und dem Anbieter.

In diesem Abschnitt erstellen wir einen Authentifizierungsanbieter, der für das Abrufen von Benutzern aus dem Backend verantwortlich ist.

Bitte erstellen Sie die Datei app/extensions/mongouserProvider.php , der Inhalt lautet wie folgt.

<?php <br?>// app/Extensions/MongoUserProvider.php<br></br>namespace App\Extensions;<br></br><br></br>use Illuminate\Support\Str;<br></br>use Illuminate\Contracts\Auth\UserProvider;<br></br>use Illuminate\Contracts\Auth\Authenticatable;<br></br><br></br>class MongoUserProvider implements UserProvider<br></br>{<br></br>  /**<br></br>   * The Mongo User Model<br></br>   */<br></br>  private $model;<br></br><br></br>  /**<br></br>   * Create a new mongo user provider.<br></br>   *<br></br>   * @return \Illuminate\Contracts\Auth\Authenticatable|null<br></br>   * @return void<br></br>   */<br></br>  public function __construct(\App\Models\Auth\User $userModel)<br></br>  {<br></br>    $this->model = $userModel;<br>  }<br><br>  /**<br>   * Retrieve a user by the given credentials.<br>   *<br>   * @param  array  $credentials<br>   * @return \Illuminate\Contracts\Auth\Authenticatable|null<br>   */<br>  public function retrieveByCredentials(array $credentials)<br>  {<br>      if (empty($credentials)) {<br>          return;<br>      }<br><br>    $user = $this->model->fetchUserByCredentials(['username' => $credentials['username']]);<br><br>      return $user;<br>  }<br><br>  /**<br>   * Validate a user against the given credentials.<br>   *<br>   * @param  \Illuminate\Contracts\Auth\Authenticatable  $user<br>   * @param  array  $credentials  Request credentials<br>   * @return bool<br>   */<br>  public function validateCredentials(Authenticatable $user, Array $credentials)<br>  {<br>      return ($credentials['username'] == $user->getAuthIdentifier() &&<br>    md5($credentials['password']) == $user->getAuthPassword());<br>  }<br><br>  public function retrieveById($identifier) {}<br><br>  public function retrieveByToken($identifier, $token) {}<br><br>  public function updateRememberToken(Authenticatable $user, $token) {}<br>}<br>

In ähnlicher Weise müssen Sie sicherstellen, dass der benutzerdefinierte Anbieter retrieveByCredentials und die zuvor diskutierte Benutzermodellklasse implementieren muss. Andererseits sollte der Parameter jsondata Anforderung die JSON-kodierte Zeichenfolge der Anmeldeinformationen enthalten.

In diesem Abschnitt werden wir eine Wache erstellen, die mit dem im vorherigen Abschnitt erstellten Authentifizierungsanbieter interagiert.

Bitte erstellen Sie die Datei App/Dienste/auth/jsonguard.php , der Inhalt lautet wie folgt.

<?php <br?>// app/Services/Auth/JsonGuard.php<br></br>namespace App\Services\Auth;<br></br><br></br>use Illuminate\Http\Request;<br></br>use Illuminate\Contracts\Auth\Guard;<br></br>use Illuminate\Contracts\Auth\UserProvider;<br></br>use GuzzleHttp\json_decode;<br></br>use phpDocumentor\Reflection\Types\Array_;<br></br>use Illuminate\Contracts\Auth\Authenticatable;<br></br><br></br>class JsonGuard implements Guard<br></br>{<br></br>  protected $request;<br></br>  protected $provider;<br></br>  protected $user;<br></br><br></br>  /**<br></br>   * Create a new authentication guard.<br></br>   *<br></br>   * @param  \Illuminate\Contracts\Auth\UserProvider  $provider<br></br>   * @param  \Illuminate\Http\Request  $request<br></br>   * @return void<br></br>   */<br></br>  public function __construct(UserProvider $provider, Request $request)<br></br>  {<br></br>    $this->request = $request;<br>    $this->provider = $provider;<br>    $this->user = NULL;<br>  }<br><br>  /**<br>   * Determine if the current user is authenticated.<br>   *<br>   * @return bool<br>   */<br>  public function check()<br>  {<br>    return ! is_null($this->user());<br>  }<br><br>  /**<br>   * Determine if the current user is a guest.<br>   *<br>   * @return bool<br>   */<br>  public function guest()<br>  {<br>    return ! $this->check();<br>  }<br><br>  /**<br>   * Get the currently authenticated user.<br>   *<br>   * @return \Illuminate\Contracts\Auth\Authenticatable|null<br>   */<br>  public function user()<br>  {<br>    if (! is_null($this->user)) {<br>      return $this->user;<br>    }<br>  }<br><br>  /**<br>   * Get the JSON params from the current request<br>   *<br>   * @return string<br>   */<br>  public function getJsonParams()<br>  {<br>    $jsondata = $this->request->query('jsondata');<br><br>    return (!empty($jsondata) ? json_decode($jsondata, TRUE) : NULL);<br>  }<br><br>  /**<br>   * Get the ID for the currently authenticated user.<br>   *<br>   * @return string|null<br>  */<br>  public function id()<br>  {<br>    if ($user = $this->user()) {<br>      return $this->user()->getAuthIdentifier();<br>    }<br>  }<br><br>  /**<br>   * Validate a user's credentials.<br>   *<br>   * @return bool<br>   */<br>  public function validate(Array $credentials=[])<br>  {<br>    if (empty($credentials['username']) || empty($credentials['password'])) {<br>      if (!$credentials=$this->getJsonParams()) {<br>        return false;<br>      }<br>    }<br><br>    $user = $this->provider->retrieveByCredentials($credentials);<br><br>    if (! is_null($user) && $this->provider->validateCredentials($user, $credentials)) {<br>      $this->setUser($user);<br><br>      return true;<br>    } else {<br>      return false;<br>    }<br>  }<br><br>  /**<br>   * Set the current user.<br>   *<br>   * @param  Array $user User info<br>   * @return void<br>   */<br>  public function setUser(Authenticatable $user)<br>  {<br>    $this->user = $user;<br>    return $this;<br>  }<br>}<br>

Erstens muss unsere Klasse mongo implementieren. Erinnern Sie sich daran, dass der Schlüssel die Einstellungen widerspiegelt, die zuvor im CouchDB -Implementierungsadapter hinzugefügt wurden. In diesem Fall müssen sie nur die entsprechende Bindung in der Anmeldemethode hinzufügen, für die nicht autorisierte Nachrichten implementiert werden müssen.

Versuchen Sie andererseits etwas Ähnliches wie http://your-laravel-site/custom/mongo/login?jsondata={"username":"admin","password":"admin"}, wenn der Benutzer in Ihrer Datenbank vorhanden ist, sollten Sie eine success Nachricht zurückgeben.

Beachten Sie, dass dies nur ein Beispiel ist, um zu demonstrieren, wie benutzerdefinierte Wachen funktionieren. Für Funktionen wie Anmeldung sollten Sie eine narrensichere Lösung implementieren. Tatsächlich gebe ich nur Einblicke in den Authentifizierungsprozess.

Die heutige Reise endet hier und hoffentlich werde ich bald mehr nützliche Inhalte bringen.

Schlussfolgerung

laravel Framework bietet ein leistungsstarkes Authentifizierungssystem im Kern und kann erweitert werden, wenn Sie ein benutzerdefiniertes Authentifizierungssystem implementieren möchten. Dies ist das Thema dieses Artikels: Implementierung benutzerdefinierter Wachen und Einfügen in den Laravel -Authentifizierungs -Workflow.

In diesem Prozess haben wir ein System entwickelt, das Benutzer basierend auf der angeforderten JSON -Nutzlast authentifiziert und mit der MongoDB -Datenbank entspricht. Um dies zu erreichen, haben wir schließlich eine benutzerdefinierte Wache und eine benutzerdefinierte Anbieter -Implementierung erstellt.

Ich hoffe, diese Übung wird Ihnen ein umfassendes Verständnis des Laravel-Authentifizierungsprozesses vermitteln, und jetzt sollten Sie sicherer sein, wie er intern funktioniert.

Für diejenigen, die gerade erst mit Laravel beginnen oder ihr Wissen, ihre Websites oder ihre Anwendungen durch Erweiterungen erweitern möchten, gibt es auf dem Envato -Markt viele Ressourcen zur Verfügung.

Das obige ist der detaillierte Inhalt vonSo erstellen Sie einen benutzerdefinierten Authentifizierungsschutz in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn