【问题标题】:Flask-Security: How to get / list / print all roles for a given userFlask-Security:如何获取/列出/打印给定用户的所有角色
【发布时间】:2021-08-02 02:39:51
【问题描述】:

我想列出给定用户的所有角色。

我不是在寻找current_user 也不是has_role。 这个想法是制作一个“edituser.html”,管理员可以在其中更改/添加/删除给定用户的角色。对于该用例,我需要显示要编辑的用户具有哪些角色。

我读过:Flask Security- check what Roles a User has,但我不明白如何在例如路线/视图中使用它。

我的models.py是这样的。

class Role(db.Document, RoleMixin):
    def __str__(self):
        return self.name
    name = db.StringField(max_length=80, unique=True)
    description = db.StringField(max_length=255)
    permissions = db.StringField(max_length=255)

class User(db.Document, UserMixin):
    def __str__(self):
        return self.username

    username = db.StringField(max_length=255)
    password = db.StringField(max_length=255)
    active = db.BooleanField(default=True)
    fs_uniquifier = db.StringField(max_length=64, unique=True)
    confirmed_at = db.DateTimeField()
    current_login_at = db.DateTimeField()
    last_login_at = db.DateTimeField()
    current_login_ip = db.StringField(max_length=255)
    last_login_ip = db.StringField(max_length=255)
    login_count = db.IntField(max_length=255)
    roles = db.ListField(db.ReferenceField(Role), default=[])

user_datastore = MongoEngineUserDatastore(db, User, Role)

【问题讨论】:

    标签: python python-3.x flask mongoengine flask-security


    【解决方案1】:

    这是我在我的应用中所做的事情:

    @staticmethod
    def get_users():
        """Return list of all users"""
        attrs = (
            "email",
            "active",
            "confirmed_at",
            "create_datetime",
            "update_datetime",
            "last_login_at",
            "current_login_at",
            "current_login_ip",
        )
        query = current_app.sywuserdb.user_model.query
        users = query.all()
    
        # convert to a list of dict of interesting info
        rv = []
        for user in users:
            # copy simple attributes
            userdata = {}
            for attr in attrs:
                userdata[attr] = getattr(user, attr)
            userdata["roles"] = [r.name for r in user.roles]
            rv.append(userdata)
    
        # users is a list of tuples - convert to list of dict
        return {"status": 200, "msgs": [], "data": rv}
    

    将“sywuserdb”更改为您的数据存储(您的问题中的“user_datastore”)。

    这被称为您的 API 的一部分 - 我有一个定义了以下端点的“管理员”蓝图:

    @api.route("/users", methods=["GET"])
    @auth_required("token", "session")
    @roles_accepted("admin")
    def get_users():
        rv = get_users()
        return flask.jsonify(rv), rv["status"]
    

    忽略@staticmethod - 这是因为我将它作为 UserFactory 类的一部分,因为我有一堆管理方法和 API 来管理用户。

    【讨论】:

    • 非常感谢您的回答!我应该把它放在哪里,我该如何称呼它?我对装饰器不是很熟悉,也不确定该放在哪里。
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多