Flask - 从SQLAlchemy验证哈希密码

时间:2018-05-01 18:01:56

标签: python python-3.x flask sqlalchemy

当我使用名称和明文密码的用户登录的基本身份验证时,用户正确登录。

密码在注册期间正确散列。 当我存储散列密码并尝试对其进行身份验证时,程序会给出错误:

query = s.query(User).filter(User.username.in_([POST_USERNAME]))

你可以告诉我,有什么问题吗?我怀疑检查功能无法从SQLAlchemy数据库中找到散列密码。谢谢。

当我使用时:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with User.password has an attribute 'split'

我明白了:

engine = create_engine('sqlite:///tutorial.db', echo=True) app = Flask(__name__) app.config.from_object(__name__) app.config['SECRET_KEY'] = 'XXXXX' def hash_password(password): salt = uuid.uuid4().hex return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt def check_password(hashed_password, user_password): password, salt = hashed_password.split(':') return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest() Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) username = Column(String(64)) password = Column(String(120)) email = Column(String(64)) def __init__(self, username, password, email): self.username = username self.password = password self.email = email def check_password(hashed_password, user_password): password, salt = hashed_password.split(':') return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest() Base.metadata.create_all(engine) @app.route("/") def index(): return render_template('index.html') @app.route('/login', methods=['POST']) def do_admin_login(): POST_USERNAME = str(request.form['username']) POST_PASSWORD = str(request.form['password']) Session = sessionmaker(bind=engine) s = Session() user = User.query.filter_by(username=POST_USERNAME).first() if check_password(User.password, POST_PASSWORD) == True: session['logged_in'] = True else: flash('wrong password!') return index()

{{1}}

1 个答案:

答案 0 :(得分:0)

像这样查询。 s是您的会话。

user = s.query(User).filter_by(username=POST_USERNAME).first()

然后你的if语句检查密码是错误的。您正在尝试使用模型类而不是您刚刚获得的用户实例。应该是:

if check_password(user.password, POST_PASSWORD) == True:

还有一些其他指针:模块Flask-SQLAlchemy可以帮助您在Flask中使用SQLAlchemy(全局定义会话)。另请考虑使用bcrypt作为密码。它比SHA更安全。