2013-06-26 28 views
10

これらの3つの拡張の間に基本的な違いがあるかどうか、誰もが似たようなことをすることができますか?私はドキュメントを読んできましたが、かなり多くのクロスオーバーがあるようです。私はちょうどより多くの機能を提供するものと推測しています。Flask-auth、プリンシパルとフラスコのセキュリティ

特定のユーザーに特定の権限があるように、ユーザーの役割を自分のアプリケーションに追加したいと考えています。レベル1のユーザーは5つのリソースを作成でき、レベル2のユーザーは10などを作成することができます。私自身はローリングを見ていますが、あまりにも扱いにくくはありません。私はこのhttp://flask.pocoo.org/snippets/98/の行に沿ってデコレータを使用して、このソリューションにセキュリティ上の問題があると考えていますか?私はすでにFlask-loginを使用していますので、これと統合します。

答えて

15

Flask-Authは、認証とアクセス許可の両方に対する単一の解決策ですが、私はそれが使用されている/参照されていないことを多く見ました。

フラスコ - プリンシパルはあなたが望むことをしますが、それはかわいい骨です。あなた自身を圧倒してもそれ以上の仕事はありません。

Flask-Securityは、Flask-Login、-Principal、およびその他の拡張機能をより一貫性のある全体にロールアップし、依存関係としてインストールします。可能であれば、個々の拡張からのものではなく、提供する方法を使用してください。私はそれを使用していないが、それは手作業の多くを取るように思える。

ユーザーロールを追加するだけの具体的な使用例として、Flask-Principalを使用することをおすすめします。それはうまく動作し、維持され、あなたが持っているどのような要件にも統合するのに十分一般的です。

4

一般に、それらはすべて類似していますが、一部のものは他のものより多くの機能を備えています。たとえば、Flask-Securityは非常に重く、暗号化のような余分なセキュリティ機能があります。実際、Flask-Securityには、Flask-Principalがサブセットとして含まれています。 Flask-Principalは、それがほんの1つのオプションであっても、認証のためにFlask-Loginを使用できます。したがって、それらはすべて関連していますが、一部は互いにサブセットまたはスーパーセットであることがわかります。

あなたの特定のケースでは、すでに優れたFlask-Loginを使用しています。 Flask-Loginがサポートしていないユーザーロールを追加する必要がある場合は、User Modelを拡張してRoles列を追加し、login_requiredデコレータを上書きすることをお勧めします。 Flask-Securityなどの拡張機能を使用しようとすると、それはあなたの状況で過度の可能性があります。

例として、私はUserフィールドをroleフィールドで拡張します。 "ANY"、 "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 
関連する問題