python - 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)
解决方案
这是我在我的应用程序中所做的事情:
@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 来管理用户。
推荐阅读
- javascript - 从无状态功能组件动态渲染按钮
- java - 从另一个列表创建所有可能的邻接列表
- java - 如何在spring boot中获取真实的uri地址?
- python - 贪心活动选择算法
- openstack - `cinder-manage db sync` 和 `cinder-manage db online_data_migrations` 命令之间有什么区别?
- php - 在 Wordpress 中强制下载 PDF
- django - 我在 Django 中得到(无法分配“11”:“Notification.user_to_notify”必须是“用户”实例。)
- python - 从 yahoofinancials 读取输出
- excel - 简化总 excel 公式
- javascript - Javascript 多类继承(以书店为例,这三个类:Member、Book、Transaction)