热门标签:
Q:

flask-auth、主体和flask安全[关闭]

任何人都可以告诉这3个扩展之间是否有根本的区别,或者它们都做类似的事情? 我一直在阅读文档,似乎有很多交叉。 我猜有些只是提供更多的功能。

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

原网址
A:

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

Flask-Principal会做你想要的,但它非常简单;滚动你自己的工作不会更多。

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

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

所有回答

共 1 条

author avatar

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

现在在你的具体情况下,你已经在使用Flask-Login这很棒。 如果您需要添加Flask-Login不支持的用户角色,我建议您扩展您的用户模型以添加角色列,然后复盖login_required装饰器。 如果您尝试使用Flask-Security等扩展,那么在您的情况下可能会矫枉过正。

例如,我将使用角色字段扩展我的用户类。 它可以有值"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

相似问题