Flask-auth, Принципал и Безопасность Flask
Может кто-нибудь сказать, есть ли принципиальная разница между этими 3 расширениями или они все делают подобные вещи? Я читал документы, и там, кажется, довольно много кроссовера. Я предполагаю, что некоторые просто предлагают больше возможностей.
Я хочу добавить роли пользователей в свое приложение, чтобы у определенных пользователей были определенные разрешения. т. е. пользователь уровня 1 может создать 5 ресурсов, пользователь уровня 2 может создать 10 и т. д. Я смотрю на свои собственные, это не кажется слишком сложным. Я смотрю на использование декоратора в соответствии с этим http://flask.pocoo.org/snippets/98/ ли проблемы с безопасностью с этим решением? Я уже использую Flask-login, поэтому я бы интегрировал его с этим.
2 ответа
Flask-Auth - это единое решение как для аутентификации, так и для разрешений, но я не видел, чтобы оно использовалось / использовалось много ссылок.
Flask-Principal будет делать то, что вы хотите, но это довольно скудно; кататься самостоятельно не будет намного больше работы.
Flask-Security объединяет Flask-Login, -Principal и некоторые другие расширения в более целостное целое, устанавливая их как зависимости. По возможности используйте предоставляемые им методы, а не методы из отдельных расширений. Я этим не пользовался, но, похоже, от этого потребовалось бы много ручного труда.
Для вашего конкретного случая использования просто необходимости добавления пользовательских ролей, я бы рекомендовал придерживаться Flask-Principal. Он работает хорошо, поддерживается и достаточно общий, чтобы интегрироваться с любыми вашими требованиями.
В общем, все они похожи, но некоторые из них имеют больше функций, чем другие. Например, Flask-Security очень тяжелый, с множеством дополнительных функций безопасности, таких как дополнительное шифрование. Фактически, Flask-Security включает Flask-Principal в качестве подмножества. Flask-Principal может использовать Flask-Login для авторизации, хотя это только один из вариантов. Таким образом, вы можете видеть, что они все связаны, но некоторые являются подмножествами или надмножествами друг друга.
Теперь в вашем конкретном случае вы уже используете Flask-Login, что отлично. Если вам нужно добавить роли пользователя, которые Flask-Login не поддерживает, я рекомендую вам расширить вашу модель пользователя, добавив столбец Roles, а затем переписать декоратор login_required. Если вы попытаетесь использовать такие расширения, как Flask-Security и т. Д., Это может быть излишним в вашей ситуации.
В качестве примера я расширю свой класс User полем роли. Может иметь значения "ЛЮБОЙ", "АДМИНИСТРАТОР" и т. Д. ЛЮБОЕ означает, что не имеет значения.
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