Защита от флагов, основных и флагов

Может ли кто-нибудь сказать, существует ли принципиальная разница между этими тремя расширениями или все они делают подобные вещи? Я читал документы и, похоже, довольно много кроссовера. Я предполагаю, что некоторые просто предлагают больше возможностей.

Я хочу добавить роли пользователя в свое приложение, чтобы определенные пользователи имели определенные разрешения. то есть пользователь уровня 1 может создать 5 ресурсов, пользователь уровня2 может создать 10 и т.д. Я смотрел на сворачивание собственного, это не кажется слишком сложным. Я смотрю на использование декоратора по линии этого http://flask.pocoo.org/snippets/98/ будут ли какие-либо проблемы с безопасностью с этим решением? Я уже использую Flask-login, поэтому я бы интегрировал его с этим.

Ответ 1

Flask-Auth - это единственное решение как для проверки подлинности, так и для разрешений, но я не видел, чтобы он часто использовался/упоминался.

Flask-Principal будет делать то, что вы хотите, но это довольно голые кости; не будет работать больше.

Flask-Security сворачивает Flask-Login, -Principal и некоторые другие расширения в более последовательное целое, устанавливая их как зависимости. Используйте методы, которые он предоставляет, а не те, которые указаны в отдельных расширениях, когда это возможно. Я не использовал его, но похоже, что от этого потребуется много ручного труда.

Для вашего конкретного случая использования просто для добавления пользовательских ролей я бы рекомендовал придерживаться Flask-Principal. Он работает хорошо, поддерживается и достаточно общий для интеграции с любыми вашими требованиями.

Ответ 2

В общем, все они похожи, но некоторые из них имеют больше возможностей, чем другие. Например, Flask-Security очень тяжела с множеством дополнительных функций безопасности, таких как шифрование. Фактически, Flask-Security включает в себя подклассу Flask-Principal. Flask-Principal может использовать Flask-Login для auth, хотя это всего лишь один вариант. Таким образом, вы можете видеть, что все они связаны друг с другом, но некоторые из них являются подмножествами или надмножествами друг друга.

Теперь в вашем конкретном случае вы уже используете Flask-Login, который отлично. Если вам нужно добавить роли пользователя, которые Flask-Login не поддерживает, я рекомендую вам расширить свою модель пользователя, чтобы добавить столбец "Роли", а затем перезаписать декоратор login_required. Если вы попытаетесь использовать расширения, такие как Flask-Security и т.д., Это может быть излишним в вашей ситуации.

В качестве примера я расширю свой класс User с помощью поля role. Он может иметь значения "ЛЮБОЙ", "ADMIN" и т.д. ЛЮБОЕ средство не имеет значения.

class User(UserMixin):
    def get_role():
        return rolename

Затем я перезаписываю декоратор login_required как:

def login_required(role="ANY"):
    def wrapper(fn):
        @wraps(fn)
        def decorated_view(*args, **kwargs):

            if not current_user.is_authenticated():
                 return current_app.login_manager.unauthorized()

            urole = current_user.get_role()
            if ( (urole != role) and (role != "ANY")):
                    logout_user()
                    return current_app.login_manager.unauthorized()    
            return fn(*args, **kwargs)   
        return decorated_view
    return wrapper