Flask-Security:如何获取/列出/打印给定用户的所有角色

问题描述

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

我不是在寻找 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)

解决方法

这是我在我的应用中执行的操作:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...