在 flask-security 中有 users.id 的自定义主键

Have a custom primary key for users.id in flask-security

我想为字段 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)

对于我来说,我需要使用 String primary_key 列。为此,我需要更改多对多关系 table (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")),
)