Flask-auth、Principal 和 Flask Security [关闭]

Posted

技术标签:

【中文标题】Flask-auth、Principal 和 Flask Security [关闭]【英文标题】:Flask-auth, Principal and Flask Security [closed] 【发布时间】:2013-06-23 16:16:00 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

Flask-Security 将 Flask-Login、-Principal 和其他一些扩展整合成一个更加连贯的整体,将它们作为依赖项安装。尽可能使用它提供的方法,而不是来自各个扩展的方法。我没用过,但好像要花很多力气。

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

【讨论】:

【参考方案2】:

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

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

例如,我将使用角色字段扩展我的 User 类。它可以有“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 会过火吗?

以上是关于Flask-auth、Principal 和 Flask Security [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Flask Login 和 Principal - current_user 是匿名的,即使我已经登录

将数据从 UITableViewCell 发送到 Controller MVC-Principal

Flask-principal 教程(auth + authr)[关闭]

如何使用 OAuth2 通过 Spring 获取自定义 Principal 对象?

Flask-Principal 知识点

Spring Security:为啥 Authentication 正在扩展 Principal?