Flask - 为什么bcrypt返回false?

时间:2017-06-25 13:31:40

标签: python flask bcrypt

我的模型文件是这样的

from app import db, b_crypt


class Base(db.Model):

    __abstract__  = True

    id = db.Column(db.Integer, primary_key=True)
    date_created = db.Column(db.DateTime,  default=db.func.current_timestamp())
    date_modified = db.Column(db.DateTime,  default=db.func.current_timestamp(), onupdate=db.func.current_timestamp())


class User(Base):

    __tablename__ = 'auth_user'

    # User Name
    name = db.Column(db.String(128),  nullable=False)

    # Identification Data: email & password
    email = db.Column(db.String(128),  nullable=False, unique=True)
    password = db.Column(db.String,  nullable=False)

    # Authorisation Data: role & status
    role = db.Column(db.Boolean, nullable=False)
    status = db.Column(db.Boolean, nullable=False)

    # New instance instantiation procedure
    def __init__(self, name, email, password, role, status):

        self.name = name
        self.email = email
        self.password = b_crypt.generate_password_hash(password)
        self.role = role
        self.status = status

    def __repr__(self):
        return '<User %r>' % self.name

我的蓝图视图功能

from app.blueprints.authentication.models import User

# Import tools
from app.blueprints.tools.db import is_authenticated, is_registered, add_user_to_database
    @auth.route('/login', methods=['POST'])
    def login():
        email = request.form['eml']
        password = request.form['pwd']
        if is_registered(email):
            if is_authenticated(email, password):
                session['logged_in'] = True
                session['user'] = User.query.filter_by(email=email).first().username
                return redirect(url_for('index'))
            else:
                flash("Wrong Credentials")
                return render_template('auth/auth.html')
        else:
            flash("You are not registered!")
            return render_template('auth/auth.html')

和我的tools.db是这样的,这个文件基本上是我希望与主应用程序保持独立并维护模块化应用程序的功能。这些功能按照他们的名义进行。

from app.blueprints.authentication.models import User
from app import db, b_crypt


def is_registered(email):
    return User.query.filter_by(email=email).first() is not None


def is_authenticated(email, password):
    return b_crypt.check_password_hash(User.query.filter_by(email=email).first().password, password)


def add_user_to_database(username, password, email, role, status):
    try:
        user = User(
            name=username,
            password=b_crypt.generate_password_hash(password),
            email=email,
            role=role,
            status=False
        )
        db.session.add(user)
        db.session.commit()
    except Exception as manager_rugby:
        print manager_rugby.message
        db.session.rollback()

当我登录时,is_authenticated总是返回false!为什么?请帮助我真的不知道为什么它不起作用。它得到2个字符串并返回一个布尔值,但密码是正确的我不知道什么是错的

1 个答案:

答案 0 :(得分:1)

你检查过密码的哈希值了吗?我认为您需要更改__init__模型中的User方法。从那里删除这一行:

self.password = b_crypt.generate_password_hash(password)

在保存模型之前设置哈希密码。我怀疑你把密码哈希两次。这就是每次都返回false的原因。