出现运行时错误:使用 jwt-extend 在 Flask 中实现基于角色的访问控制时,必须调用 `@jwt_required()`

问题描述 投票:0回答:1

我正在尝试在我的代码中实现基于角色的访问控制。我创建了一个角色表并向其中添加了一些角色。

使用一些 YouTube 教程和文档,我得到了以下代码:

装饰器.py:

from functools import wraps
from flask import make_response
from flask_jwt_extended import get_current_user

def auth_role(role):
    def wrapper(fn):
        @wraps(fn)
        def decorator(*args, **kwargs):
            current_user = get_current_user()
            roles = role if isinstance(role, list) else [role]
            if all(not current_user.has_role(r) for r in roles):
                return make_response({"msg": f"Missing any of the following roles {':'.join(roles)}"}, 403)
            return fn(*args, **kwargs)
        return decorator
    return wrapper

routes.py:

@app.route('/test')
@auth_role("admin")
@jwt_required
def test():
    return "Hello"

init.py

app = Flask(__name__)
app.config.from_object(Config)
jwt = JWTManager(app)

一切都已正确导入。

但是,每当我尝试访问“localhost:5000/test”时,都会收到以下错误: RuntimeError: 使用此方法之前必须调用

@jwt_required()
verify_jwt_in_request()

有谁知道如何解决这个问题吗?

python flask role-based-access-control flask-jwt-extended
1个回答
0
投票

这是由于您的装饰订单造成的

@jwt_required
@app.route('/test')
def test():
return "Hello"

将返回相同的运行时错误

在 jwt_extended lib 提取令牌并解码后,您必须调用 get_current_user() 。 这里有一个工作示例使用 Flask-JWT-Extended 实现角色

© www.soinside.com 2019 - 2024. All rights reserved.