我目前正在使用Flask-RESTful和Flask-HTTPAuth构建REST API,以保护某些put和get方法。我想允许基于存储在数据库中的预定义用户权限访问这些方法。
我的问题是,如何修改或截取下面函数的结果,以便可以根据端点/方法来更改访问权限?清除基本身份验证后,我希望能够检查用户在我的数据库中是否具有相关权限。使用Flask-Session,这很容易,但是这里的API是无状态的。
@auth.verify_password
def verify_password(user, password):
query_set = models.User.objects(username=user)
if query_set:
return helpers.verify(password, query_set[0].password)
else:
return False
非常感谢你。
最佳答案
要使用基于角色的身份验证,您需要在密码步骤通过后添加第二项检查。
您有两个选择。更直接的方法是在每个端点函数中添加角色检查。如果您想要更复杂的东西来避免代码重复,那么可以定义一个自定义装饰器,例如我在这里使用的装饰器:https://github.com/miguelgrinberg/flasky/blob/master/app/decorators.py。
您将需要调整它以使用您自己的用户对象而不是current_user
,但是除此之外,这是一个很好的示例:
def permission_required(permission):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.can(permission):
abort(403)
return f(*args, **kwargs)
return decorated_function
return decorator
因此,在您的路线中,您将执行以下操作:
@app.route('/api/something')
@auth.login_required
@permission_required('admin')
def something():
pass