问题描述
我正在尝试使用 Python Flask 创建一个身份验证系统。但是,每当我提交注册表时,都没有错误并且重定向正确,但是用户信息从未存储在我的 MysqL 数据库中。
这是我用来设置 user_datastore 的代码:
(app initiation and other config)
app.config['sqlALCHEMY_DATABASE_URI'] = 'MysqL+pyMysqL://root:dumbypassword@localhost/myDB
db = sqlAlchemy(app)
roles_users = db.Table('roles_users',db.Column('email',db.String(50),db.ForeignKey('users.email')),db.Column('role',db.String(20),db.ForeignKey('roles.role'))
)
class User(db.Model):
__tablename__ = 'users'
firstName = db.Column(db.String(20),nullable=False)
lastName = db.Column(db.String(30),nullable=False)
email = db.Column(db.String(50),primary_key=True,unique=True,nullable=False)
password = db.Column(db.LargeBinary()) # should be hashed with salt
salt = db.Column(db.String(22))
active = db.Column(db.Boolean())
confirmed = db.Column(db.DateTime())
roles = db.relationship(
'Role',secondary=roles_users,backref=db.backref('users')
)
class Role(db.Model):
__tablename__ = 'roles'
role = db.Column(db.String(20),nullable=False)
description = db.Column(db.String(255))
user_datastore = sqlAlchemyUserDatastore(db,User,Role)
security = Security(app,user_datastore)
salt = bcrypt.gensalt()
user_datastore.create_user(
firstName=request.form.get('firstName'),lastName=request.form.get('lastName'),email=request.form.get('email'),password=bcrypt.hashpw(request.form.get('password').encode('utf-8'),salt),# Todo: Need to bcrypt pass + salt
salt=salt,active=1,confirmed=datetime.Now()
)
使用“POST”方法提交注册表后,没有存储任何信息:( 查看我的查询和结果:
我偷偷怀疑我正在屠杀所有这些,因此我们将不胜感激,包括但不限于命名/格式约定。
解决方法
回答您的确切问题 - 看起来您没有将事务提交给数据库。 Flask-Security 作为 @after_this_request 的一部分执行此操作,以便如果在请求期间发生任何错误,数据将回滚。所以 - 在处理后的某个地方你需要调用 datastore.commit()
元问题是 - 看起来您正在重新发明一堆东西。 Flask-Security-Too 已经管理注册,您可以轻松扩展它 - 此外,让面向安全的包完成它们的工作是最佳实践 - 所以对于密码和加盐 - Flask-Security 和 passlib 已经有很多管理这些的历史 -所以除非你有一些特定的要求(我想听听这些要求)把它留给他们。绝对不要将盐与用户记录一起存储在数据库中。 Flask-Security-Too 有一个你可以使用的公共 api 'hash_password'(它使用 passlib 的 CryptoContext 来传递适当的选项)。