【问题标题】:Implementing roles with Flask-JWT-Extended使用 Flask-JWT-Extended 实现角色
【发布时间】:2022-01-13 11:49:56
【问题描述】:

我目前正在开发一个使用flask-jwt-extended 来保护端点的flask api。我让 jwt 所需的装饰器正常工作,但我想添加角色以对访问进行更精细的控制。在我的想象中,最好有三个表用户、角色和用户角色。 UserRoles 将使用外部 id 将用户映射到角色,然后使用自定义装饰器检查每个端点。

我以前从未这样做过,您将如何实施?为什么?

【问题讨论】:

    标签: python-3.x flask flask-sqlalchemy flask-jwt-extended


    【解决方案1】:

    正如您所建议的,拥有一些基本的表和方法 + 装饰器是可行的方法。

    您还可以在Flask-Security 中查看这是如何实现的 (或在 Flask-Security 中使用的包 Flask-Login 和 Flask-Principal 中)。它可以为您提供一些关于您希望拥有什么样的功能的建议。

    【讨论】:

    • 感谢您的快速回复,您认为我的解决方案是标准的还是有不同的方法来解决这个问题?
    • 据我所知,这似乎是身份验证问题的标准解决方案。但是,我在这方面的知识非常有限。此外,我一般没有使用 JWT 和 API 端点的经验。
    【解决方案2】:

    根据docs,应该可以使用自定义装饰器,如下所示:

    from flask_jwt_extended import get_jwt
    from flask_jwt_extended import verify_jwt_in_request
    
    
    # Here is a custom decorator that verifies the JWT is present in the request,
    # as well as insuring that the JWT has a claim indicating that this user is
    # an administrator
    def admin_required():
        def wrapper(fn):
            @wraps(fn)
            def decorator(*args, **kwargs):
                verify_jwt_in_request()
                claims = get_jwt()
                if claims["is_administrator"]:
                    return fn(*args, **kwargs)
                else:
                    return jsonify(msg="Admins only!"), 403
    
            return decorator
    
        return wrapper
    

    只需确保您保存角色信息using additional claims

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 2018-08-08
      • 2020-02-26
      • 2020-12-05
      相关资源
      最近更新 更多