2013-06-26 2 views
10

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

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

ответ

15

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

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

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

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

4

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

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

Как пример, я расширю свой класс User с помощью поля role. Он может иметь значения «ЛЮБОЙ», «АДМИН» и т. Д. ЛЮБОЕ средство не имеет значения.

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