Wie die Umsetzung user_loader callback-in Kolben-Login
Ich bin versucht, Kolben und die Kolben-Login Erweiterung zu implementieren, die Nutzer-Authentifizierung in einen Kolben app. Das Ziel ist, ziehen Sie Benutzer-account-Informationen aus einer Datenbank und melden Sie sich an Benutzer, aber ich bin stecken, aber ich habe es eingeengt zu einem bestimmten Teil der Kolben-Login-Verhalten.
Entsprechend der Kolben-Login Dokumentation, ich brauche zum erstellen einer user_loader "callback" - Funktion. Der eigentliche Zweck und Durchführung dieser Funktion hat, verwirrte mich jetzt seit ein paar Tagen:
Müssen Sie eine user_loader Rückruf. Dieser callback wird verwendet
zum laden des Benutzer-Objekt aus der Benutzer-ID in der session gespeichert. Es
sollte die Unicode-ID eines Benutzers und die Anzeige der entsprechenden
Benutzer-Objekt. Zum Beispiel:@login_manager.user_loader def load_user(userid): return User.get(userid)
Nun, ich sagen möchten, dass der Benutzer geben Sie einen Namen und Passwort in ein Formular ein, vergleichen mit Datenbank-und log-in des Benutzers. Die Datenbank funktioniert gut und ist für mich kein problem.
Diese "callback" - Funktion werden will, übergeben Sie eine Benutzer-ID #, und den Benutzer-Objekt (der Inhalt der, die ich bin laden aus einer Datenbank). Aber ich weiß nicht wirklich, was es eigentlich zu prüfen/tun, da Sie die Benutzer-IDs sind alle gezogen aus dem gleichen Ort sowieso. Ich kann 'sozusagen die' callback zu arbeiten, aber es scheint chaotisch/hackish und es hat die Datenbank mit jeder einzigen Ressource, die der browser anfordert. Ich wirklich nicht wollen, um zu überprüfen, meine Datenbank, um auf download favicon.ico mit jeder Aktualisierung der Seite, aber Kolben-login scheint wie es ist und erzwingen Sie diese.
Wenn ich nicht überprüfen Sie die Datenbank erneut, dann habe ich keine Möglichkeit, wieder ein User-Objekt aus dieser Funktion. Das User-Objekt/Klasse erzeugt wird, in das Fläschchen route für die Anmeldung, und ist somit nicht in den Umfang der Rückrufaktion.
Was ich nicht herausfinden kann, ist, wie übergibt man ein Objekt in dieser callback-Funktion, die zimmerreserviereung, ohne das schlagen der Datenbank jede einzelne Zeit. Oder, anders herauszufinden, wie Sie gehen über das tun dies in einer effizienteren Weise. Ich muss fehlt etwas grundlegendes, aber ich starrte es für ein paar Tage jetzt, werfen alle Arten von Funktionen und Methoden, und nichts funktioniert.
Hier sind die entsprechenden Ausschnitte aus meinem test-code. Die User-Klasse:
class UserClass(UserMixin):
def __init__(self, name, id, active=True):
self.name = name
self.id = id
self.active = active
def is_active(self):
return self.active
Die Funktion habe ich gemacht, um den Benutzer-Objekt-an-Kolben-Login user_loader callback-Funktion:
def check_db(userid):
# query database (again), just so we can pass an object to the callback
db_check = users_collection.find_one({ 'userid' : userid })
UserObject = UserClass(db_check['username'], userid, active=True)
if userObject.id == userid:
return UserObject
else:
return None
Die 'callback', die ich nicht so ganz verstehen (muss wieder das Benutzer-Objekt, das erzeugt wird, nach dem ziehen aus Datenbank):
@login_manager.user_loader
def load_user(id):
return check_db(id)
Login route:
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST" and "username" in request.form:
username = request.form["username"]
# check MongoDB for the existence of the entered username
db_result = users_collection.find_one({ 'username' : username })
result_id = int(db_result['userid'])
# create User object/instance
User = UserClass(db_result['username'], result_id, active=True)
# if username entered matches database, log user in
if username == db_result['username']:
# log user in,
login_user(User)
return url_for("index"))
else:
flash("Invalid username.")
else:
flash(u"Invalid login.")
return render_template("login.html")
Mein code 'irgendwie' funktioniert, kann ich an-und Abmelden, aber wie gesagt, es muss schlagen, die Datenbank für absolut alles, weil ich ein User-Objekt die callback-Funktion in einen anderen namespace/Bereich aus, wo der rest der login-action stattfindet. Ich bin mir ziemlich sicher, ich mache alles falsch, aber ich kann nicht herausfinden, wie.
Den Beispiel code von Kolben-login macht es auf diese Weise, aber das funktioniert nur, weil es zieht der Anwender Objekte aus einem globalen hard-coded Wörterbuch, nicht wie in einem realen Szenario, wie eine Datenbank, wo die DB überprüft werden müssen und Benutzer-Objekte erstellt nach der Benutzer gibt seine Anmeldedaten ein. Und ich kann nicht scheinen, finden alle anderen Beispiel-code veranschaulicht die Verwendung einer Datenbank mit Kolben-login.
Was fehlt hier?
- wie seltsam. Ihr login() nicht überprüfen Sie für jedes Passwort.
- Das war nur zum Beispiel Zwecken.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie zum laden der user-Objekt aus der DB, auf jede Anfrage. Der stärkste Grund für diese Anforderung ist, dass die Kolben-Anmeldung überprüfen Sie die Authentifizierungs-token jedes mal, um sicherzustellen, seine Gültigkeit. Die Berechnung dieses token erfordern gespeicherten Parameter auf dem user-Objekt.
Angenommen, ein Benutzer hat zwei gleichzeitige Sitzungen. In einem von Ihnen, dem Benutzer sein Passwort ändert. In nachfolgenden Anfragen ist, muss der Benutzer angemeldet sein, aus der zweiten Sitzung und gezwungen login neu für Ihre Anwendung sicher ist. Denken Sie an den Fall, wo die zweite Sitzung ist gestohlen, weil Ihre Benutzer vergessen hat, sich aus einem computer, Sie wollen Ihr Passwort ändern Sie sofort die situation zu korrigieren. Vielleicht wollen Sie auch zu geben, Ihre Administratoren die Fähigkeit, kick einen Benutzer aus.
Für solche Zwangs-logout passieren, das Authentifizierungs-token in einem cookie gespeichert, muss 1) basieren zum Teil auf das Passwort oder etwas anderes, das ändert sich jedes mal, wenn ein neues Passwort gesetzt ist; 2) überprüft werden, bevor Sie anzeigen, Sie vor den neuesten bekannten Attribute des Benutzer-Objekt -, die gespeichert werden in der DB.
Hier ist mein code, andere
User
als Daten-mapping-Objekt bietenquery_pwd_md5
Methode.User-login:
User-Klasse: