Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse des Logikflusses der schnellen Authentifizierung von Laravel5

Analyse des Logikflusses der schnellen Authentifizierung von Laravel5

不言
不言Original
2018-07-04 15:42:501792Durchsuche

Dieser Artikel stellt hauptsächlich die Analyse des schnellen Authentifizierungsprozesses von Laravel5 vor. Er hat einen gewissen Referenzwert. Jetzt kann ich ihn mit allen Freunden teilen, die ihn benötigen.

Laravel5 selbst wird mit einer Reihe von Benutzern geliefert Authentifizierungsfunktion, verwenden Sie einfach die Befehlszeile php artisan make:auth und php artisan migrate就可以使用自带的快速认证功能。

unter einem neuen Projekt. Das Folgende ist eine logische Analyse der Anmeldefunktion, die auf der Laravel 5.5-Version basiert.

Rufen Sie die Anmelderoute (rotes Feld) über den Befehl php artisan route:list ab:

Öffnen und anzeigen Sie /app/Http/Controller/Auth/ LoginController.php, der Dateicode ist sehr prägnant. Tatsächlich sind die Anmeldelogik und -methoden in das Merkmal von Illuminate/Foundation/Auth/AuthenticatesUsers integriert:

View the Anmeldemethode des IlluminateFoundationAuthAuthenticatesUsers-Codes, Parameter $ request ist das Anforderungsobjekt, einschließlich Anmeldeanforderungsinformationen, einschließlich Anmeldename, Passwort usw.:

Zeile31: Die Methode „validateLogin“ ist dafür verantwortlich, die Methode „validate“ des Controllers selbst zur Überprüfung aufzurufen. Es ist nicht erforderlich, detailliert darauf einzugehen, ob der Benutzername und das Passwort einfachen Regeln entsprechen.

Es ist erwähnenswert, dass Entwickler diese Methode in LoginController anpassen können, um die Trait-Methode zu überschreiben und das Login-Kontofeld anzupassen an „E-Mail“.

Ändern Sie die Methode username() des Merkmals nicht direkt. Behalten Sie die Integrität des Laravel5-Frameworks bei.

Zeile36: hasTooManyLoginAttempts-Methode, mit der überprüft wird, ob die Anzahl der Kontoanmeldeversuche den festgelegten Maximalwert erreicht.

Diese Methode bezieht sich auf die Eigenschaft von IlluminateFoundationAuthThrottlesLogins. Wenn Sie sich den Namen des Merkmals ansehen, können Sie vermuten, dass es für die Vermeidung gewalttätiger Anmeldungen verantwortlich ist.

Limiter() in der obigen Abbildung gibt ein RateLimiter-Objekt (wie der Name schon sagt: Frequenzbegrenzer) zurück, das vom App-Service-Container erstellt wird. Dieses Objekt stammt aus: IlluminateCacheRateLimiter-Datei.

Wie Sie am Standort dieses Objekts erkennen können, verwendet es den Laravel-Caching-Mechanismus, um die Anzahl der Anmeldungen zu verwalten.

Die hasTooManyLoginAttempts-Methode im obigen Bild ruft also die tooManyAttempts-Methode des RateLimiter-Objekts auf, um die Anzahl der Anmeldungen zu überprüfen:

Die tooManyAttempts-Methode hat drei Parameter :

$key: Der entsprechende Schlüssel, der von cacche zum Speichern der Anmeldenummer des aktuellen Kontos verwendet wird. Die Schlüsselzusammensetzung ist wie folgt:

Der Schlüsselwert sieht also ungefähr so ​​aus: „email|101:10:45:12“. Daraus ist ersichtlich, dass die Brute-Force-Cracking-Verhinderung IP nutzt. Wenn ich meine IP ändere, kann ich natürlich immer noch versuchen, mich erneut anzumelden. Obwohl es immer Einschränkungen gibt, ist es immer noch viel besser, als nackt zu sein.

$maxAttempts: Der Einstellungswert der maximalen Anzahl von Anmeldeversuchen.

Dieser Wert kann angepasst werden. Sie können das benutzerdefinierte maxAttempts-Attribut in LoginController schreiben. Der Standardwert ist 5 Mal: ​​

$decayMinutes: Die Wartezeit in Minuten, um die Anmeldung nach Erreichen der maximalen Anzahl von Versuchen fortzusetzen.

Dieser Wert kann auch in LoginController angepasst werden. Der Standardwert ist 1 Minute:

Zurück zur RateLimiter::tooManyAttempts-Methode Es wird ermittelt, ob die aktuelle Anzahl der Anmeldungen den festgelegten Wert erreicht hat. Wenn sie den festgelegten Wert erreicht und immer noch innerhalb des letzten verbotenen Anmeldezeitbereichs liegt, wird „true“ zurückgegeben, was darauf hinweist, dass dem aktuellen Benutzer (IP) die Protokollierung weiterhin untersagt ist In.

Das rote Kästchen im Bild unten wird verwendet, um zu bestimmen, ob der Wert $key.':timer' im Cache vorhanden ist. Dieser Wert verwendet die obige Zeit von $decayMinutes als Ablaufzeit, also die Existenz dieses Werts Der Wert ist der Schlüssel zum Wiederherstellen des Anmeldestatus.

Wenn der zwischengespeicherte Wert nicht vorhanden ist, kann sich der aktuelle Benutzer anmelden. Zu diesem Zeitpunkt löscht die Methode „resetAttempts“ den Wert der Anmeldezeiten im $key-Cache und beginnt mit der Aufzeichnung bei Null.

Das Codeausführungsrecht kehrt wieder zu Zeile 36 von IlluminateFoundationAuthAuthenticatesUsers zurück:

Wenn hasTooManyLoginAttempts true zurückgibt, wird das Lockout-Ereignis initiiert und die LockoutResponse-Antwort zurückgegeben. Benutzer können einen Lockout-Ereignismonitor generieren, um die mit dem Ereignis verbundene Logik zu verarbeiten, z. B. das Aufzeichnen von Anmeldeprotokollen usw.

Die LockoutResponse-Antwort löst im Wesentlichen eine Verifizierungsausnahme aus, die von Laravel automatisch als Antwort mit dem Statuscode 423 interpretiert wird und auth.throttle-Konfigurationsinformationen enthält. Die Originalsprache dieser Konfiguration befindet sich unter: /resources/lang/en/auth.php. Benutzer können ihre eigenen Sprachinformationen anpassen.

Kehren Sie dann zu Zeile 42 von IlluminateFoundationAuthAuthenticatesUsers zurück und beginnen Sie mit der Anmeldeüberprüfung:

Der Gatekeeper-Name, der von der tryLogin-Methode über config/auth.php konfiguriert wurde , Generieren Sie das entsprechende Schutzobjekt und rufen Sie dann den Versuch des Objekts zur Anmeldeüberprüfung auf.

Laravel5 Guard unterstützt derzeit zwei Typen: SessionGuard und tokenGuard, beide werden im IlluminateAuth-Ordner gespeichert. Sie sind alle in der IlluminateContractsAuthGuard-Schnittstelle implementiert, wenn Sie das also anpassen müssen Guard, bitte implementieren Sie diese Schnittstelle.
Wenn Sie einen Web-Guard implementieren möchten, können Sie die IlluminateContractsAuthStatefulGuard-Schnittstelle weiter implementieren.

Welcher Schutz unter welchen Umständen verwendet werden soll, wird alle in config/auth.php konfiguriert:

Da das, was ich dieses Mal analysiere, ist Web-Anmeldevorgang, überprüfen Sie daher die Versuchsmethode von IlluminateAuthsessionGuard:

Zeile 351: Die Funktion dieser Zeile besteht darin, die Kontoinformationen über den konfigurierten Anbieter abzurufen. Es gibt auch zwei Arten von Anbietern: DatabaseUserProvider und EloquentUserProvider. Die Datei befindet sich unter: /Illuminate/Auth.

Der zu verwendende Anbieter wird über den Provider-Parameter von config/auth.php konfiguriert. Nach der Konfiguration müssen Sie auch im Parameter „guards“ angeben, welcher Anbieter verwendet werden soll. Der Anbieter bietet im Wesentlichen eine Möglichkeit, die Datenbankkontotabelle abzufragen. Die Datenbank verwendet zum Abfragen direkt die Datenbank-DB-Fassade, während eloquent ein Modell zum Abfragen verwendet.

Laravel verwendet standardmäßig EloquentUserProvider. Wenn man sich die Methode „retrieByCredentials“ ansieht, ist es offensichtlich, dass die Benutzerinformationen direkt über den Kontonamen abgerufen werden:

Zurück Die Versuchsmethode von IlluminateAuthsessionGuard und die hasValidCredentials-Methode von Zeile 356 überprüfen das Passwort, wenn die Benutzerinformationen im vorherigen Schritt normal abgerufen werden können.

Wie aus dem Hauptteil der hasValidCredentials-Methode hervorgeht, ruft sie die „validateCredentials“-Methode des Anbieters zur Passwortüberprüfung auf. Sehen Sie sich die Methode EloquentUserProvider::validateCredentials an:

Diese Überprüfungsmethode verwendet die Prüfmethode der Hash-Klasse, die durch den HasherContract-Vertrag implementiert wird. Die spezifischen Implementierungsklassen sind: IlluminateHashingBcryptHasher. Schauen wir uns die Prüfmethode dieser Klasse an:

Offensichtlich verwendet sie die Funktion „password_verify“, um das eingegebene Klartext-Passwort mit dem gehashten Passwortwert zu vergleichen. Dies erfordert, dass die Datenbankkennwörter mit „password_hash“ gehasht wurden.

Gibt true zurück, wenn die Passwortüberprüfung erfolgreich ist. Kehren Sie zu sessionGuard zurück und führen Sie die Anmeldemethode von Zeile 357 aus, um den Sitzungs- und Cookie-Anmeldestatus aufzuzeichnen.

Der Schlüssel und der Wert der gespeicherten Sitzung sind:

'key'=>'login_session_'.sha1(static::class) // static::class bezieht sich auf die sessionGuard-Klasse selbst

'value'=>Der Primärschlüsselwert des aktuellen Benutzers

Wenn die Option „remember_me“ verwendet wird, wird das folgende Cookie mit gespeichert Schlüssel und Wert wie folgt:

'key'=>''remember_session_'.sha1(static::class) //static::class bezieht sich auf die sessionGuard-Klasse selbst

' value'=>Primärschlüsselwert des Benutzers .'|'.Der zuletzt gespeicherte Remember_token-Wert.'|'.Hash-Wert des Benutzerkennworts

Zu diesem Zeitpunkt hat sich der Benutzer erfolgreich angemeldet und der Ausführungspunkt ist endlich erreicht kehrt zu Zeile 42 von IlluminateFoundationAuthAuthenticatesUsers zurück und gibt „true“ zurück. Rufen Sie dann die sendLoginResponse-Methode auf, um nach der Anmeldung oder der letzten Anmeldeseite zur Hauptseite zu springen.

Beachten Sie, dass die authentifizierte Methode eine leere Methode ist. Sie können diese Methode in LoginController neu definieren, um anzupassen, wie andere Logik nach der Anmeldung gesprungen wird.

Wenn die Anmeldung nicht erfolgreich ist, führen Sie die Methode incrementLoginAttempts($request) von IlluminateFoundationAuthAuthenticatesUsers aus, um die Anzahl der fehlgeschlagenen Anmeldungen zu erhöhen. Die Methode zum Erhöhen der Häufigkeit besteht auch darin, indirekt die hit()-Methode der RateLimiter-Klasse aufzurufen.
Rufen Sie abschließend sendFailedLoginResponse auf, um eine Anmeldeausnahme zurückzugeben.

Schließlich ist das Zeitdiagramm beigefügt. Die Zeichnung ist durchschnittlich. Bitte verzeihen Sie mir 🎜>Das ist es. Der gesamte Inhalt dieses Artikels soll für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website!

Verwandte Empfehlungen:

Einführung in das Eloquent-Modell von Laravel

So verwenden Sie Wamp zum Erstellen einer lokalen PHP-Entwicklungsumgebung und einer HBuilder-Debugging-Methode

Das obige ist der detaillierte Inhalt vonAnalyse des Logikflusses der schnellen Authentifizierung von Laravel5. 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