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)

person aquatic7    schedule 11.05.2021    source източник


Отговори (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 за управление на потребители.

person jwag    schedule 14.05.2021
comment
Благодаря ви МНОГО за отговора! Къде да сложа това и как да го нарека? Не съм много запознат с декораторите и не съм много сигурен къде да го сложа. - person aquatic7; 19.05.2021