Flask-Auth、Principal和Flask Security

11

请问这三个扩展之间是否有根本性的区别,还是它们都做类似的事情?我一直在阅读文档,发现它们之间存在相当多的重叠。我猜测有些只提供更多的功能。

我想在我的应用程序中添加用户角色,以便特定用户具有特定的权限。例如,level1用户可以创建5个资源,level2用户可以创建10个资源等等。我一直在考虑自己编写代码,这似乎并不太困难。我正在考虑使用类似于http://flask.pocoo.org/snippets/98/ 这样的装饰器,这个方案会有任何安全问题吗?我已经在使用Flask-login,所以我会将其与此集成。

2个回答

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 不支持的用户角色,我建议您扩展 User Model 来添加 Roles 列,然后覆盖 login_required 装饰器。如果您尝试使用像 Flask-Security 等扩展,可能会在您的情况下过度使用。
例如,我将在我的用户类中添加一个角色字段。它可以有“ANY”,“ADMIN”等值。ANY的意思是不重要。
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

你能解释一下为什么使用Flask-Security会过度设计吗? - AlxVallejo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接