[PYTHON] Ich habe den Mechanismus der Flaschenanmeldung untersucht!

flask-login Ich habe eine Anmeldefunktion mit flask-login implementiert, wollte aber den internen Mechanismus kennen, also habe ich den Mechanismus anhand der Dokumentation und des Quellcodes untersucht!

Definieren wir die folgenden Eigenschaften / Methoden in der Klasse: delphin: User

Sie können die UserMixin-Klasse erweitern.

: dolphin: Initialisieren wir flask_login

from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"

Definieren wir eine Rückruffunktion zum Laden: delphin: user

@login_manager.user_loader
def load_user(userid):
    return User(userid)

Das hier von load_user empfangene Argument ist der von get_id () zurückgegebene Wert, der in der User-Klasse definiert ist. Lassen Sie get_id () bei Bedarf den Wert zurückgeben, der erforderlich ist, um den Benutzer aus der Datenbank abzurufen: smile:

: cat: Implementieren wir den Anmeldevorgang

def login():
    form = LoginForm()
    if form.validate_on_submit():
        login_user(user)
        flask.flash('Logged in successfully.')
        next = flask.request.args.get('next')
        if not is_safe_url(next):
            return flask.abort(400)
        return flask.redirect(next or flask.url_for('index'))
    return flask.render_template('login.html', form=form)

Übergeben Sie den Benutzer an login_user und flask-login erledigt den Rest. Es speichert hauptsächlich die Informationen, die zum Aufrechterhalten des Anmeldestatus in der Sitzung erforderlich sind, aktualisiert den Benutzer des Anforderungskontexts, sendet das Anmeldesignal usw .: bow:

: dog: Implementieren wir die Abmeldeverarbeitung

@app.route("/logout")
@login_required
def logout():
    logout_user()
    return redirect(somewhere)

Es ist sehr einfach, rufen Sie einfach logout_user auf. In der Funktion logout_user wird der angemeldete Benutzer abgerufen und der Abmeldevorgang ausgeführt, sodass der Benutzer nicht übergeben werden muss. Grob gesagt ist es das Gegenteil von Anmelden. Um den Anmeldestatus beizubehalten, löschen Sie den in der Sitzung enthaltenen Wert, aktualisieren Sie den Benutzer im Anforderungskontext auf anonym_user und senden Sie das Abmeldesignal. : Augen rollen:

: Kaninchen: Verhalten vor dem Login

Rufen Sie im Dekorator login_required den aktuellen Benutzer ab. current_user versucht, den Benutzer aus den in der Sitzung gespeicherten Informationen abzurufen (insbesondere user_id). [ein] Da es vor der Anmeldung ist, hat die Sitzung keine Benutzer-ID, sodass das Abrufen des Benutzers fehlschlägt. Wenn request_loader definiert ist, verwenden Sie diese, um sich anzumelden. Da request_loader diesmal nicht definiert ist, ist current_user ein anonymer Benutzer. Da is_authenticated, das in der Klasse Anonymous User definiert ist, False zurückgibt, wird festgestellt, dass es nicht authentifiziert ist, und LoginMangers unauthorized () wird aufgerufen, um zum Anmeldebildschirm umzuleiten.

: Kaninchen: Verhalten nach dem Login

Dies entspricht [a] des Verhaltens vor der Anmeldung. Wenn der Benutzer erfolgreich erfasst wurde, wird der Benutzer so zurückgegeben, wie er ist. Überprüfen Sie, ob der Benutzer mit is_authenticated authentifiziert ist. Da es sich nicht um einen anonymen Benutzer handelt, wird True zurückgegeben, wie im Benutzermodell definiert. Da festgestellt wird, dass es authentifiziert ist, wird die nachfolgende Verarbeitung fortgesetzt: Lachen:

: bear: Sicherheitsmaßnahmen

--HttpOnly-Attribut Standardmäßig enthält Flask Sitzungsinformationen auf der Clientseite, die als Cookie-basierte Sitzung bezeichnet werden. Setzen Sie daher SESSION_COOKIE_HTTPONLY auf True, um zu verhindern, dass Javascript auf diese Informationen zugreift. (Standard ist True) [1]

By default, it is activated in "basic" mode. It can be disabled in the app’s configuration by setting the SESSION_PROTECTION setting to None, "basic", or "strong". When session protection is active, each request, it generates an identifier for the user’s computer (basically, a secure hash of the IP address and user agent). If the session does not have an associated identifier, the one generated will be stored. If it has an identifier, and it matches the one generated, then the request is OK. If the identifiers do not match in basic mode, or when the session is permanent, then the session will simply be marked as non-fresh, and anything requiring a fresh login will force the user to re-authenticate. (Of course, you must be already using fresh logins where appropriate for this to have an effect.) If the identifiers do not match in strong mode for a non-permanent session, then the entire session (as well as the remember token if it exists) is deleted. [3]

[1] https://flask.palletsprojects.com/en/1.1.x/config/#SESSION_COOKIE_HTTPONLY [2] https://flask.palletsprojects.com/en/1.1.x/config/#SESSION_COOKIE_SECURE [2] https://flask-login.readthedocs.io/en/latest/#session-protection

Recommended Posts

Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Ich untersuchte den stärkenden Lernalgorithmus des Algorithmushandels
Ich habe untersucht, wie das Zielfernrohr aussieht
Ich habe die Gerätebaumüberlagerung untersucht
Ich habe die X-Means-Methode untersucht, mit der die Anzahl der Cluster automatisch geschätzt wird
Ich untersuchte das Verhalten bezüglich des Unterschieds zwischen Hard Link und Symbolic Link
Erläutern Sie den Mechanismus der PEP557-Datenklasse
Ich habe den Inhalt des Docker-Volumes überprüft
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Die Ordnerstruktur von Flask ist zusammengefasst
Ich kannte die Grundlagen von Python nicht
Die Python-Projektvorlage, an die ich denke.
Untersuchen wir den Mechanismus von Kaijis Chinchirorin
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
Ich habe die Implementierung von range gelesen (Objects / rangeobject.c)
Ich habe die Liste der Tastenkombinationen von Jupyter überprüft
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Probieren Sie Progate Free Edition [Python I]
Ich habe die Sitzungsaufbewahrungsdauer von Django überprüft
Ich habe die Verarbeitungsgeschwindigkeit der numpy eindimensionalisierung überprüft
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
Ich habe die Varianten von UKR gelesen und implementiert
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Der Beginn von cif2cell
[Rezept des Trainers] Ich habe die Flasche des Python-Frameworks berührt.
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe das MNIST-Tutorial von tensorflow für Anfänger ausprobiert.
Die Bedeutung des Selbst
Ich verfolgte die Implementierung des Befehls du (erste Hälfte)
Ich verglich die Identität der Bilder nach Hu Moment
[Statistik] Verstehen Sie den Mechanismus von Q-Q-Plots mit Animation.
Vielleicht habe ich die Auswirkungen von Shell Shock auf CGI überschätzt
der Zen von Python
Die Geschichte von sys.path.append ()
Ich habe die Ausgabespezifikationen von Bidirectional LSTM von PyTorch überprüft
Ich habe mir die Versionen von Blender und Python angesehen
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Die Leistung von PHP war besser als ich erwartet hatte
Ich habe das Argument class_weight von Chainers Funktion softmax_cross_entropy untersucht.
Ich habe die Leistung von 1 Million Dokumenten mit mongoDB gemessen
Ich habe das Standardbetriebssystem und die Shell der Docker-Maschine überprüft
Ich verfolgte die Implementierung des Befehls du (zweite Hälfte)
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
[Ev3dev] Lassen Sie uns den Mechanismus der LCD-Steuerung (Bildschirmsteuerung) verstehen
Ich habe die Berechnungszeit von "X in Liste" (lineare Suche / dichotome Suche) und "X in Menge" untersucht.
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Werbung für die Raubkopien-Website zu kratzen
Ich habe die Körner gezählt
Ich habe die einfachste Methode zur Klassifizierung von Dokumenten mit mehreren Etiketten ausprobiert
Rache der Typen: Rache der Typen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
Ich habe nach dem Inhalt von CloudWatch Logs Agent gesucht