Flask-HTTPAuth用户访问级别

doo*_*lah 1 python rest flask flask-restful flask-httpauth

我目前正在使用Flask-RESTful构建REST API,并使用Flask-HTTPAuth来保护一些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
Run Code Online (Sandbox Code Playgroud)

非常感谢你.

Mig*_*uel 5

要使用基于角色的身份验证,您需要在传递密码步骤后添加第二个检查.

你有两个选择.更直接的是在每个端点函数中添加角色检查.如果你想要更复杂的东西来避免代码重复,那么你可以定义一个自定义装饰器,例如我在这里使用的装饰器: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
Run Code Online (Sandbox Code Playgroud)

那么在你的路线中,你这样做:

@app.route('/api/something')
@auth.login_required
@permission_required('admin')
def something():
    pass
Run Code Online (Sandbox Code Playgroud)