Сочетание RoleNeed с опорой Flask

Я пытаюсь создать разрешение, которое требует, чтобы у пользователя была роль A или роль B.

Согласно документации https://pythonhosted.org/Flask-Principal/, следующая строка создает разрешение, которое требует от пользователя роли A И роль B.

combined_permission = Permission(RoleNeed('roleA'), RoleNeed('roleB'))

Знаете ли вы, как создать разрешение, используя OR вместо AND?

1 ответ

Решение

В настоящее время потребности в совместном разрешении проверяются с помощью OR, Цитирование из документации:

класс flask_principal.Разрешение(*необходимо)
Представляет потребности, любые из которых должны присутствовать для доступа к ресурсу

Если вы хотите AND вместо этого просто подкласс Permission класс и переопределить allows Метод проверки того, что пересечение множеств совпадает с потребностями разрешения в первую очередь:

class RequiresAll(Permission):
    def allows(self, identity):
        if not has_all(self.needs, identity.provides):
            return False

        if self.excludes and self.excludes.intersection(identity.provides):
            return False

        return True

def has_all(needed=None, provided=None):
    if needed is None:
        return True

    if provided is None:
        provided = set()

    shared = needed.intersection(provided)
    return shared == needed
Другие вопросы по тегам