Flask-auth,Principal和Flask Security

时间:2013-06-26 13:33:27

标签: flask flask-security flask-principal

有人能说出这三个扩展之间是否存在根本区别,或者他们都做了类似的事情吗?我一直在阅读文档,似乎有很多交叉。我猜一些只是提供更多功能。

我想在我的应用中添加用户角色,以便某些用户具有某些权限。即level1用户可以创建5个资源,level2用户可以创建10个等等。我一直在寻找滚动我自己,它似乎并不太棘手。我正在考虑使用这个http://flask.pocoo.org/snippets/98/的装饰器,这个解决方案会有任何安全问题吗?我已经在使用Flask-login,所以我将它与它集成。

2 个答案:

答案 0 :(得分:15)

Flask-Auth是身份验证和权限的单一解决方案,但我还没有看到它使用/引用太多。

Flask-Principal会做你想做的事,但它很简陋;滚动自己的工作不会多得多。

Flask-Security将Flask-Login,-Principal和其他一些扩展汇总成一个更连贯的整体,将它们作为依赖项安装。尽可能使用它提供的方法而不是各个扩展方法。我没有使用它,但似乎需要大量的手工劳动。

对于仅需要添加用户角色的特定用例,我建议坚持使用Flask-Principal。它运行良好,维护良好,并且足够通用,可以满足您的任何要求。

答案 1 :(得分:4)

一般来说,它们都很相似,但有些功能比其他功能更多。例如,Flask-Security非常繁重,具有许多额外的安全功能,例如加密。事实上,Flask-Security包含Flask-Principal作为子集。 Flask-Principal可以使用Flask-Login进行身份验证,即使这只是一个选项。所以你可以看到它们都是相关的,但有些是彼此的子集或超集。

现在在您的具体情况下,您已经在使用Flask-Login了,这非常棒。如果您需要添加Flask-Login不支持的用户角色,我建议您扩展用户模型以添加Roles列,然后覆盖login_required装饰器。如果您尝试使用Flask-Security等扩展程序,那么在您的情况下可能会有些过分。

例如,我将使用角色字段扩展我的User类。它可以具有“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
相关问题