shopfreephoenix.com

  

Beste Artikel:

  
Main / Wann arbeiten Login Benutzer

Wann arbeiten Login Benutzer

Dies ist der fünfte Teil der Flask Mega-Tutorial-Reihe, in der ich Ihnen erklären werde, wie Sie ein Benutzeranmeldesubsystem erstellen.

Hinweis 1: Wenn Sie nach der Legacy-Version dieses Tutorials suchen, finden Sie diese hier. Hinweis 2: Wenn Sie meine Arbeit in diesem Blog unterstützen möchten oder einfach nicht die Geduld haben, auf wöchentliche Artikel zu warten, biete ich die vollständige Version dieses Tutorials als E-Book oder als Satz von Videos an.

Weitere Informationen finden Sie in den Kursen. In Kapitel 3 haben Sie gelernt, wie Sie das Benutzeranmeldeformular erstellen, und in Kapitel 4 haben Sie gelernt, wie Sie mit einer Datenbank arbeiten. In diesem Kapitel erfahren Sie, wie Sie die Themen aus diesen beiden Kapiteln kombinieren, um ein einfaches Benutzeranmeldesystem zu erstellen.

Die GitHub-Links für dieses Kapitel sind: Durchsuchen, Zip, Diff. In diesem Feld wird ein Hash des Benutzerkennworts gespeichert, mit dem das vom Benutzer während des Anmeldevorgangs eingegebene Kennwort überprüft wird.

Das Hashing von Passwörtern ist ein kompliziertes Thema, das Sicherheitsexperten überlassen werden sollte. Es gibt jedoch mehrere einfach zu verwendende Bibliotheken, die diese Logik auf eine Weise implementieren, die einfach von einer Anwendung aus aufgerufen werden kann.

Eines der Pakete, die das Passwort-Hashing implementieren, ist Werkzeug, auf das Sie möglicherweise bei der Installation von Flask in der Ausgabe von pip verwiesen haben, da es eine seiner Kernabhängigkeiten ist. Da es sich um eine Abhängigkeit handelt, ist Werkzeug bereits in Ihrer virtuellen Umgebung installiert. Die folgende Python-Shell-Sitzung zeigt, wie ein Kennwort gehasht wird: In diesem Beispiel wird die Passwort-Foobar durch eine Reihe von kryptografischen Operationen, für die keine umgekehrte Operation bekannt ist, in eine lange codierte Zeichenfolge umgewandelt. Dies bedeutet, dass eine Person, die das Hash-Passwort erhält, es nicht verwenden kann, um das ursprüngliche Passwort zu erhalten.

Wenn Sie dasselbe Kennwort mehrmals hashen, erhalten Sie als zusätzliche Maßnahme unterschiedliche Ergebnisse. Daher können Sie anhand der Hashes nicht feststellen, ob zwei Benutzer dasselbe Kennwort haben. Die Überprüfungsfunktion verwendet einen zuvor generierten Kennwort-Hash und ein Kennwort, das der Benutzer zum Zeitpunkt der Anmeldung eingegeben hat. Die Funktion gibt True zurück, wenn das vom Benutzer angegebene Kennwort mit dem Hash übereinstimmt, oder andernfalls False. Mit diesen beiden Methoden kann ein Benutzerobjekt jetzt eine sichere Kennwortüberprüfung durchführen, ohne dass jemals die ursprünglichen Kennwörter gespeichert werden müssen.

Hier ist ein Beispiel für die Verwendung dieser neuen Methoden: In diesem Kapitel stelle ich Ihnen eine sehr beliebte Flask-Erweiterung namens Flask-Login vor. Diese Erweiterung verwaltet den angemeldeten Status des Benutzers, sodass sich Benutzer beispielsweise bei der Anwendung anmelden und dann zu verschiedenen Seiten navigieren können, während sich die Anwendung "merkt", dass der Benutzer angemeldet ist. Außerdem bietet sie die Funktion "Angemeldet bleiben" ermöglicht es Benutzern, auch nach dem Schließen des Browserfensters angemeldet zu bleiben.

Um für dieses Kapitel bereit zu sein, können Sie zunächst Flask-Login in Ihrer virtuellen Umgebung installieren: So wird diese Erweiterung initialisiert: Die Flask-Login-Erweiterung arbeitet mit dem Benutzermodell der Anwendung und erwartet, dass bestimmte Eigenschaften und Methoden darin implementiert werden. Dieser Ansatz ist hilfreich, da Flask-Login keine anderen Anforderungen hat, solange diese erforderlichen Elemente zum Modell hinzugefügt werden. Daher kann es beispielsweise mit Benutzermodellen arbeiten, die auf einem beliebigen Datenbanksystem basieren.

Ich kann diese vier leicht implementieren, aber da die Implementierungen ziemlich allgemein sind, bietet Flask-Login eine Mixin-Klasse namens UserMixin, die generische Implementierungen enthält, die für die meisten Benutzermodellklassen geeignet sind.

So wird die Mixin-Klasse zum Modell hinzugefügt: Flask-Login verfolgt den angemeldeten Benutzer, indem seine eindeutige Kennung in der Benutzersitzung von Flask gespeichert wird, einem Speicherplatz, der jedem Benutzer zugewiesen wird, der eine Verbindung zur Anwendung herstellt.

Jedes Mal, wenn der angemeldete Benutzer zu einer neuen Seite navigiert, ruft Flask-Login die ID des Benutzers aus der Sitzung ab und lädt diesen Benutzer in den Speicher. Da Flask-Login nichts über Datenbanken weiß, benötigt es die Hilfe der Anwendung beim Laden eines Benutzers. Aus diesem Grund erwartet die Erweiterung, dass die Anwendung eine Benutzerladefunktion konfiguriert, die aufgerufen werden kann, um einen Benutzer mit der angegebenen ID zu laden.

Der User Loader ist bei Flask-Login mit dem Login registriert. Die ID, die Flask-Login als Argument an die Funktion übergibt, ist eine Zeichenfolge. Daher müssen Datenbanken, die numerische IDs verwenden, die Zeichenfolge wie oben gezeigt in eine Ganzzahl konvertieren. Lassen Sie uns die Anmeldeansichtsfunktion erneut aufrufen, die, wie Sie sich erinnern, eine gefälschte Anmeldung implementiert hat, die gerade eine Flash-Nachricht ausgegeben hat. Nachdem die Anwendung Zugriff auf eine Benutzerdatenbank hat und weiß, wie Kennwort-Hashes generiert und überprüft werden, kann diese Ansichtsfunktion ausgeführt werden.

Die beiden obersten Zeilen der Anmeldefunktion befassen sich mit einer seltsamen Situation. Das ist eindeutig ein Fehler, deshalb möchte ich das nicht zulassen. Der Wert dieser Variablen kann ein Benutzerobjekt aus der Datenbank sein, das Flask-Login über den oben angegebenen User Loader-Rückruf liest, oder ein spezielles anonymes Benutzerobjekt, wenn sich der Benutzer noch nicht angemeldet hat.

Erinnern Sie sich an die Eigenschaften, die Flask-Login im Benutzerobjekt benötigt? Wenn der Benutzer bereits angemeldet ist, leite ich einfach zur Indexseite weiter. Anstelle des zuvor verwendeten Flash-Aufrufs kann ich den Benutzer jetzt wirklich anmelden.

Der erste Schritt besteht darin, den Benutzer aus der Datenbank zu laden. Der Benutzername wurde mit der Formularübermittlung geliefert, sodass ich die Datenbank damit abfragen kann, um den Benutzer zu finden. Da ich weiß, dass es nur ein oder null Ergebnisse geben wird, vervollständige ich die Abfrage, indem ich zuerst aufrufe, wodurch das Benutzerobjekt zurückgegeben wird, wenn es existiert, oder None, wenn es nicht existiert. In Kapitel 4 haben Sie gesehen, dass beim Aufrufen der all-Methode in einer Abfrage die Abfrage ausgeführt wird und Sie eine Liste aller Ergebnisse erhalten, die dieser Abfrage entsprechen.

Die erste Methode ist eine weitere häufig verwendete Methode zum Ausführen einer Abfrage, wenn Sie nur ein Ergebnis benötigen. Wenn ich eine Übereinstimmung mit dem angegebenen Benutzernamen habe, kann ich als nächstes überprüfen, ob das Passwort, das auch mit dem Formular geliefert wurde, gültig ist. Dadurch wird der beim Benutzer gespeicherte Kennwort-Hash verwendet und festgestellt, ob das im Formular eingegebene Kennwort mit dem Hash übereinstimmt oder nicht. Jetzt habe ich zwei mögliche Fehlerbedingungen: In beiden Fällen flashe ich eine Nachricht und leite zur Anmeldeaufforderung zurück, damit der Benutzer es erneut versuchen kann.

Ich weiß, dass ich Benutzern auch die Möglichkeit bieten muss, sich von der Anwendung abzumelden. Hier ist die Abmeldeansichtsfunktion: Um diesen Link für Benutzer verfügbar zu machen, kann ich den Login-Link in der Navigationsleiste automatisch zu einem Logout-Link wechseln lassen, nachdem sich der Benutzer angemeldet hat. Dies kann mit einer Bedingung in der Basis erfolgen. Flask-Login bietet eine sehr nützliche Funktion, mit der Benutzer sich anmelden müssen, bevor sie bestimmte Seiten der Anwendung anzeigen können.

Wenn ein Benutzer, der nicht angemeldet ist, versucht, eine geschützte Seite anzuzeigen, leitet Flask-Login den Benutzer automatisch zum Anmeldeformular weiter und leitet erst nach Abschluss des Anmeldevorgangs zu der Seite zurück, die der Benutzer anzeigen wollte.

Damit diese Funktion implementiert werden kann, muss Flask-Login die Ansichtsfunktion kennen, mit der Anmeldungen verarbeitet werden. Der obige 'Login'-Wert ist der Funktions- oder Endpunktname für die Login-Ansicht. Wenn Sie diesen Dekorator zu einer Ansichtsfunktion unterhalb der App hinzufügen. So kann der Dekorator auf die Indexansichtsfunktion der Anwendung angewendet werden: Was bleibt, ist die Rückleitung von der erfolgreichen Anmeldung auf die Seite, auf die der Benutzer zugreifen wollte.

Das nächste Abfragezeichenfolgenargument wird auf die ursprüngliche URL festgelegt, sodass die Anwendung diese verwenden kann, um nach der Anmeldung zurückzuleiten. Hier ist ein Codeausschnitt, der zeigt, wie das nächste Abfragezeichenfolgenargument gelesen und verarbeitet wird:

Flask stellt eine Anforderungsvariable bereit, die alle Informationen enthält, die der Client mit der Anforderung gesendet hat. Insbesondere die Anfrage. Es gibt tatsächlich drei mögliche Fälle, die berücksichtigt werden müssen, um zu bestimmen, wohin nach einer erfolgreichen Anmeldung umgeleitet werden soll: Der erste und der zweite Fall sind selbsterklärend. Der dritte Fall dient dazu, die Anwendung sicherer zu machen. Ein Angreifer kann im nächsten Argument eine URL zu einer schädlichen Site einfügen, sodass die Anwendung nur umleitet, wenn die URL relativ ist. Dadurch wird sichergestellt, dass die Weiterleitung auf derselben Site wie die Anwendung bleibt.

Erinnern Sie sich daran, dass ich in Kapitel 2 einen gefälschten Benutzer erstellt habe, der mir beim Entwerfen der Startseite der Anwendung helfen soll, bevor das Benutzersubsystem eingerichtet wurde? Nun, die Anwendung hat jetzt echte Benutzer, sodass ich jetzt den gefälschten Benutzer entfernen und mit echten Benutzern arbeiten kann. Dies ist ein guter Zeitpunkt, um zu testen, wie die Anmelde- und Abmeldefunktion funktioniert. Da es immer noch keine Benutzerregistrierung gibt, können Sie einen Benutzer nur über die Python-Shell zur Datenbank hinzufügen. Führen Sie daher die Flask-Shell aus und geben Sie die folgenden Befehle ein, um einen Benutzer zu registrieren:

Wenn Sie die Anwendung starten und versuchen, auf http zuzugreifen: Die letzte Funktionalität, die ich in diesem Kapitel erstellen werde, ist ein Registrierungsformular, damit sich Benutzer über ein Webformular registrieren können.

In dieser neuen Form gibt es einige interessante Dinge, die sich auf die Validierung beziehen. Zunächst habe ich für das E-Mail-Feld nach DataRequired einen zweiten Validator namens E-Mail hinzugefügt. Dies ist ein weiterer Bestandsvalidator, der mit WTForms geliefert wird und sicherstellt, dass die vom Benutzer in dieses Feld eingegebenen Daten mit der Struktur einer E-Mail-Adresse übereinstimmen. Da es sich um ein Registrierungsformular handelt, ist es üblich, den Benutzer aufzufordern, das Kennwort zweimal einzugeben, um das Risiko eines Tippfehlers zu verringern.

Aus diesem Grund habe ich Passwort und Passwort2 Felder. Das zweite Kennwortfeld verwendet einen weiteren Bestandsvalidator namens EqualTo, der sicherstellt, dass sein Wert mit dem für das erste Kennwortfeld identisch ist. In diesem Fall möchte ich sicherstellen, dass der vom Benutzer eingegebene Benutzername und die E-Mail-Adresse nicht bereits in der Datenbank enthalten sind. Daher geben diese beiden Methoden Datenbankabfragen aus, bei denen erwartet wird, dass keine Ergebnisse erzielt werden.

Falls ein Ergebnis vorliegt, wird durch Auslösen von ValidationError ein Validierungsfehler ausgelöst. Die Nachricht, die als Argument in der Ausnahme enthalten ist, ist die Nachricht, die neben dem Feld angezeigt wird, damit der Benutzer sie sehen kann. Diese Vorlage ist ähnlich aufgebaut wie die für das Anmeldeformular:.

Die Anmeldeformularvorlage benötigt einen Link, der neue Benutzer zum Registrierungsformular direkt unter dem Formular sendet: Und diese Ansichtsfunktion sollte auch meist selbsterklärend sein. Ich stelle zunächst sicher, dass der Benutzer, der diese Route aufruft, nicht angemeldet ist. Das Formular wird genauso behandelt wie das zum Anmelden. Mit diesen Änderungen sollten Benutzer in der Lage sein, Konten in dieser Anwendung zu erstellen und sich anzumelden und abzumelden . Stellen Sie sicher, dass Sie alle Validierungsfunktionen ausprobieren, die ich im Registrierungsformular hinzugefügt habe, um besser zu verstehen, wie sie funktionieren.

Ich werde das Benutzerauthentifizierungssubsystem in einem zukünftigen Kapitel erneut besuchen, um zusätzliche Funktionen hinzuzufügen, z. B. um dem Benutzer das Zurücksetzen des Kennworts zu ermöglichen, wenn es vergessen wird. Im Moment reicht dies jedoch aus, um weitere Bereiche der Anwendung zu erstellen.

Hallo und vielen Dank für Ihren Besuch auf meinem Blog! Wenn Ihnen dieser Artikel gefallen hat, können Sie meine Arbeit in diesem Blog auf Patreon unterstützen! Andernfalls funktioniert es nicht, da wir den gefälschten Benutzer löschen.

(с) 2019 shopfreephoenix.com