2017-07-18 2 views
0

Hier ist die Situation:Wie mache ich Python eine neue Klasseninstanz für jede Sitzung erstellen?

Ich habe eine App, die eine Benutzer-Login-Funktion enthält.

Das Problem, das ich habe, ist dies:

Wenn sich ein Benutzer anmeldet/Versuch schlägt fehl, und ein Benutzerobjekt anmelden erstellt. Für den einen Benutzer entspricht es dem erwarteten Verhalten von:

  1. Gehen Sie auf eine Seite, während nicht angemeldet EXPECT Weiterleitung zur Anmeldeseite.
  2. Geben Sie falsche Login-Informationen nicht einen fünften Versuch oder darüber hinaus EXPECT Redirect Login-Seite.
  3. Falsche Login-Informationen zum 5. Mal oder später, EXPECT-Weiterleitung an eine schwerwiegende Login-Fehlermeldung von einer beliebigen Route versucht, keine weiteren Anmeldeversuche akzeptiert werden.
  4. korrekte Login-Daten ERWARTEN Inhalt gegeben sind für alle Strecken

Das Problem, das ich ist zu beheben versuchen sichtbar gemacht, dass, wenn ein Benutzer angemeldet ist, dies im Rahmen der alle Benutzersitzungen interpretiert wird, nicht die Sitzung, die von diesem Benutzer erstellt wurde. Sobald ein Benutzer angemeldet ist, erhalten alle Benutzer, die auf die App zugreifen möchten, Zugriff, bis sich der Benutzer abmeldet, ohne dass die nachfolgenden Benutzer das Kennwort eingeben müssen. So

Ich habe die Klasse wie diese, die als Benutzerobjekt dient:

class User: 
    def __init__(self,password,user_name) 
     self.password = some_password_hashing_method(password) 
     self.username = user_name 
     self.loggedin = False 
     self.passwordguesses = 0 

Dies ist die Funktionalität, die eine Login-Anforderung auswertet. Es beginnt mit der Überprüfung, ob ein Benutzerobjekt vorhanden ist (sollte Sitzung für Sitzung sein), und wenn es nicht existiert, instantiiert es das Objekt nach der Login-Anforderung und vergleicht die Werte mit dem Hashalgorithmus anhand der Liste der Hash-Passwörter benutzt.

Es funktioniert mit einem Benutzer, aber das Problem ist, dass wenn ein Benutzer anmeldet, ein zweiter Benutzer die App von einem anderen Computer mit einer anderen IP-Adresse eingibt, erstellt es kein neues Benutzerobjekt. Es wird sehen, dass die vorhandene user.loggedin auf True gesetzt ist, und behandelt den Benutzer als ob sie angemeldet wären, wenn nicht, ein anderer Benutzer ist angemeldet.

Wie mache ich Python behandeln diese Variable als eine Instanzvariable, die jedes Mal generiert wird, wenn eine neue Benutzersitzung erstellt wird?

@app.route('/verifylogin',methods = ['POST']) 
def verifylogin(): 
    checksPassword = g.readcsv('filewithpasswords.csv') 
    usersList = g.readcsv('filelistingusers.csv') 
    global user 
    try: 
     the_user.passwordguesses 
    except NameError: 
     user = User(request.form['userid'],request.form['password']) 
    i = 0 
    if user.password_guesses < 5: 
     while i < len(checksPassword): 
      if somehashcheckingmethod(checksPassword[i][0], request.form['password']) and usersList[i][0] == request.form['userid']: 
       user.loggedin = True 
       return redirect('/index') 
      i += 1 
     user.passwordguesses += 1 
     return redirect('/login') 
    else: 
     return render_template('fatal.html') 

Schließlich ist hier die Umleitungskopfzeile, die am Anfang aller Seiten enthalten ist. Das erwartete Verhalten besteht darin, 1. zu prüfen, ob für diesen Benutzer eine aktive Benutzersitzung vorhanden ist. Ist dies nicht der Fall, werden sie zur Anmeldeleitung umgeleitet. 2. Es wird überprüft, ob der aktuelle Benutzer angemeldet ist, und wenn nicht, werden sie auch auf die Anmeldeseite umgeleitet. 3. Wenn keine von beiden wahr ist, geht es weiter zu den folgenden Codezeilen und bietet Zugriff auf den Inhalt.

try:    
    user.isloggedin 
except NameError: 
    return redirect('login') 
if user.isloggedin != True: 
    return redirect('login') 

Auch hier gibt es offenbar ein Problem mit dem Kontext dieser Code in interpretiert wird, weil es den angemeldeten Status eines Benutzers auf alle nachfolgenden Benutzersitzungen bewirbt.

Bitte beachten Sie, dass die folgende Zeile auszukommen dieses Problem nicht beheben:

global user 

Sobald dies geführt wird kommentiert, dies ändert sich der Umfang des Benutzerobjekts im Rahmen der Funktion verifylogin nur sein () worin es erklärt wurde.

Also, wenn ich eine neue Route und die Funktion schreiben ihren Inhalt zu machen, nun das Objekt ‚Benutzer‘ ist außerhalb des Bereichs der Funktion schreibe ich den Inhalt für die neue Route zu machen:

@app.route('/index.html') 
def index():  
    try:    
     user.isloggedin 
    except NameError: 
     return redirect('login') 
    if user.isloggedin != True: # this code and all code below it is unreachable, because you will always get a NameError exception from the above lines of code. This is not a duplicate. 
     return redirect('login') 
    return render_template('index.html') 

Antwort

0

Dies wird normalerweise im Web unter Verwendung von sessions, geliefert durch secure cookies, erreicht.

https://blog.miguelgrinberg.com/post/how-secure-is-the-flask-user-session

Eine Sitzung ist eine sichere (hoffentlich) Cookie, das Ihre Anwendung jeden Kunden zur Verfügung stellt. Ihre App sollte in der Lage sein, eine persistente Einzelsitzung zu generieren, die so lange dauert, wie die Sitzung aktiv ist. Bei vielen der gängigen Web-Frameworks enthält das Cookie nur eine Sitzungs-ID. Auf diese Weise können Sie den persistenten Status für den Benutzer speichern und seine Sitzungs-ID als Referenz verwenden.

Verwandte Themen