首页 > 解决方案 > Flask-Security:如何获取/列出/打印给定用户的所有角色

问题描述

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

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

我读过:Flask Security-检查用户拥有的角色,但我不明白如何在例如路由/视图中使用它。

我的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)

标签: pythonpython-3.xflaskmongoengineflask-security

解决方案


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

@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 来管理用户。


推荐阅读