我目前正在开发一个使用flask-jwt-extended 来保护端点的flask api。我有 jwt 所需的装饰器正常工作,但我想添加角色以对访问进行更精细的控制。在我的想象中,最好有三个表 Users、Roles 和 UserRoles。 UserRoles 将使用外部 ID 将用户映射到角色,然后使用自定义装饰器检查每个端点。
我以前从未这样做过,你会如何实现这个以及为什么?
根据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
只需确保您保存角色信息使用附加声明。
正如您所建议的,拥有一些基本的表格和方法+装饰器是正确的选择。
您还可以在 Flask-Security 中了解这是如何实现的 (或者在 Flask-Login 和 Flask-Principal 包中,它们在 Flask-Security 中使用)。它可以为您提供一些关于您想要拥有什么样的功能的建议。