Login Modul mit Flask

Django, Flask, Bottle, WSGI, CGI…
Antworten
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Guten Abend zusammen,
spiele gerade ein wenig mit der Flask extension "login" herum. Habe ein ganze einfaches Beispiel geschrieben und mich an diesem hier: https://github.com/flask-admin/flask-ad ... uth/app.py orientiert.

Code: Alles auswählen

from flask import Flask, render_template, request, session
from flask.ext.sqlalchemy import SQLAlchemy                                     
import flask.ext.login as login                                                        
from passlib.hash import pbkdf2_sha256                                          

app = Flask(__name__)                                                           
login_manager = login.LoginManager()                                            
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:passwd@localhost:3307/flask_test"
app.config["SECRET_KEY"] = "123456789"                                        
                                                                                
db = SQLAlchemy(app)                                                            
login_manager.init_app(app)

class User(db.Model):                                                           
    id = db.Column(db.Integer, primary_key=True)                                
    vorname = db.Column(db.String(50))                                          
    nachname = db.Column(db.String(50))                                         
    password = db.Column(db.String(100))                                        
    email = db.Column(db.String(120), unique=True)                              
                                                                                
    def __init__(self, vorname, nachname, password, email):                     
        self.vorname = vorname                                                  
        self.nachname = nachname                                                
        self.password = password                                                
        self.email = email                                                      
                                                                                
    def __repr__(self):                                                         
       return "<User %r>" %self.email                                           
                                                                                
    def is_authenticated(self):                                                 
        return True                                                             
                                                                                
    def is_active(self):                                                        
        return True                                                             
                                                                                
    def is_anonymous(self):                                                     
        return False                                                            
                                                                                
    def get_id(self):                                                           
        return self.id

@login_manager.user_loader                                                      
def load_user(userid):                                                          
    return User.query.filter_by(id=userid).one()                                
                                                                                
def hashnewpasswd(password):                                                    
    return pbkdf2_sha256.encrypt(password, rounds=2000, salt_size=16)           
                                                                                
def verifypasswd(aktpasswd, dbpasswd):                                          
    return pbkdf2_sha256.verify(aktpasswd, dbpasswd)

@app.route("/login", methods=["GET", "POST"])                                      
def login():                                                                    
    print "login"                                                               
    if request.method == "POST":                                                
        if not "email" in request.form or not "password" in request.form:       
            return render_template("login.html", fehler=True)                   
        user = request.form["email"]                                            
        passwd = request.form["password"]                                       
        userrec = User.query.filter_by(email=user).all()                        
        if not userrec:                                                         
            print "Kein User gefunden"                                          
            return render_template("login.html", fehler=True)                   
        print userrec[0]                                                        
        if not verifypasswd(passwd, userrec[0].password):                       
            print "Passwort ist falsch"                                         
            return render_template("login.html", fehler=True)                   
        login_user(userrec[0])                                                  
        return "Eingelogt"                                                     
                                                                                
                                                                                
    return render_template("login.html")
if __name__ == "__main__":                                                      
    app.debug = True                                                            
    app.run(host="0.0.0.0")

Code: Alles auswählen

{% extends "layout.html" %}                                                     
{% block content %}                                                             
{% if fehler == True%}                                                          
    <h1>Fehler</h1>                                                             
{%endif%}                                                                       
<link rel="stylesheet" href="{{ url_for('static', filename='css/login.css') }}">
<div class="container">                                                         
      <form class="form-signin" method="post" action="{{url_for('login')}}">       
        <h2 class="form-signin-heading">Please sign in</h2>                     
        <label for="inputEmail" class="sr-only">Email address</label>           
        <input type="email" name="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
        <label for="inputPassword" class="sr-only">Password</label>             
        <input type="password" name="password" id="inputPassword" class="form-control" placeholder="Password" required>
        <div class="checkbox">                                                  
          <label>                                                               
            <input type="checkbox" value="remember-me"> Remember me             
          </label>                                                              
        </div>                                                                  
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
      </form>                                                                   
                                                                                
</div> <!-- /container -->                                                      
{% endblock %}

Wenn ich mich nun versuche einzuloggen kommt der Fehler:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/tom/Dokumente/web-workspace/haba-fanreisen/haba.py", line 124, in login
login_user(userrec[0])
File "/usr/local/lib/python2.7/dist-packages/flask_security/utils.py", line 64, in login_user
if _security.trackable:
File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 338, in __getattr__
return getattr(self._get_current_object(), name)
File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 297, in _get_current_object
return self.__local()
File "/usr/local/lib/python2.7/dist-packages/flask_security/utils.py", line 35, in <lambda>
_security = LocalProxy(lambda: current_app.extensions['security'])
KeyError: 'security'
Also ein wenig gegoogelt und herausbekommen, dass man das Modul "flask-security" noch braucht.
Also das ganze installiert und mich in den QuickStart guide (http://pythonhosted.org/Flask-Security/quickstart.html) eingelesen und gemerkt, dass man dort sehr viel Vordefinieren muss und an viele Restriktionen gebunden ist.
Ist dies wirklich so oder übersehe ich das offensichtliche?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Flask-Login hängt nicht von Flask-Security ab. login_user ist allerdings eine Flask-Security Funktion die du dem Traceback nach selbst aufrufst.

Davon abgesehen nutzt du viel zu wenige Rounds, 20.000 sollten es schon mindestens sein. Außerdem nutzt du als host 0.0.0.0 was in Kombination mit debug jeder Person im gleichen Netzwerk (möglicherweise dem ganzen Internet) erlaubt beliebigen Code auf dem Rechner auszuführen.
Antworten