有一个自定义主键,用于 users.id 烧瓶安全



我想为字段 id 提供一个自定义键,例如,id_user,我已经尝试了以下方法

class UserModel(db.model, UserMixin)
...
@property
def id(self):
return self.id_user

但无法使其工作。当我尝试登录时,它会向我发送以下消息:

{
"message": "You don't have the permission to access the requested resource. It is either read-protected or not readable by the server."
}

我最终得到了一个令人讨厌的解决方案。我克隆了UserModel对象,为id添加了一个重复的字段,以及我需要的自定义密钥,并告诉Flask-Security将该对象用作UserModel这是我使用的函数代码:

def clone_model(model):
data = model
attr = getattr(model, "id_user")
setattr(data, "id", attr)
return data
cUserModel = clone_model(UserModel)
user_datastore = SQLAlchemyUserDatastore(db, cUserModel, Roles)
security = Security(app, user_datastore)

希望有人觉得有用

对于任何使用 Flask-Security-Too 希望更改默认 id 列的人,这是我的解决方案。

像往常一样定义用户表和角色表,并根据您的喜好定义 id 列。


class Role(db.Model, FsRoleMixin):
__tablename__ = 'role'
id = Column(String, primary_key=True)

class Users(db.Model, FsUserMixin):
__tablename__ = 'users'
id = Column(String, primary_key=True)

对我来说,我需要使用Stringprimary_key列。为此,我需要更改多对多关系表(roles_users)。下面是相同的代码片段。

# Initialize the db object
db = SQLAlchemy()

# import this Class
from flask_security.models.fsqla_v2 import FsModels
# call this after creating the db object
FsModels.db = db
FsModels.user_table_name = 'users' # If you want a different table name than the default
FsModels.role_table_name = 'role'
# Create the relationship table as per your preferences
FsModels.roles_users = db.Table(
"roles_users",
Column("user_id", String, ForeignKey("users.id")),
Column("role_id", String, ForeignKey("role.id")),
)

最新更新