2013-06-26 44 views
10

任何人都可以告訴這3個擴展名之間是否存在根本區別,或者他們是否都做類似的事情?我一直在閱讀文檔,似乎有很多交叉。我猜一些只是提供更多的功能。Flask-auth,Principal和Flask Security

我想將用戶角色添加到我的應用程序,以便某些用戶具有某些權限。即level1用戶可以創建5個資源,level2用戶可以創建10個等。我一直在尋找自己的滾動,這似乎不太棘手。我正在尋找使用這個http://flask.pocoo.org/snippets/98/這一行的裝飾器,這個解決方案是否會存在安全問題?我已經在使用Flask-login,所以我將它與此集成。

回答

15

Flask-Auth是認證和權限的單一解決方案,但我還沒有看到它使用/引用太多。

Flask-Principal會做你想做的事情,但它非常簡單;滾動你自己不會有更多的工作。

Flask-Security將Flask-Login,-Principal和其他一些擴展集成爲一個更加一致的整體,將它們安裝爲依賴關係。儘可能使用它提供的方法,而不是單個擴展中的方法。我沒有使用它,但它似乎需要大量的手工勞動。

對於您只需添加用戶角色的特定用例,我會建議堅持使用Flask-Principal。它運作良好,維護良好,並且通用性足以與您擁有的任何要求進行整合。

4

一般來說,它們都是相似的,但其中一些具有比其他更多的功能。例如,Flask-Security非常繁重,帶有許多額外的安全功能,如額外加密。事實上,Flask-Security包含Flask-Principal作爲子集。 Flask-Principal可以使用Flask-Login進行身份驗證,即使這只是一個選項。所以你可以看到它們都是相關的,但有些是彼此的子集或超集。

現在在您的具體情況下,您已經在使用Flask-Login,它非常出色。如果您需要添加Flask-Login不支持的用戶角色,我建議您擴展您的用戶模型以添加角色列,然後覆蓋login_required裝飾器。如果您嘗試使用Flask-Security等擴展程序,可能會導致您的情況過度。

舉例來說,我將用角色字段擴展我的用戶類。它可以有值「任何」,「管理員」等任何手段無關緊要。

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 
相關問題