权限

Flask-REST-JSONAPI 提供了强大的权限系统支持。

例:

from flask import Flask
from flask_rest_jsonapi import Api
from your_project.permission import permission_manager

app = Flask(__name__)

api = Api()
api.init_app(app)
api.permission_manager(permission_manager)

上例中,API会在每个方法方法前,检查权限。检查权限的方式就是依次调用permission_manager中的函数。

定义permission_manager必须符合下述规范:

def permission_manager(view, view_args, view_kwargs, *args, **kwargs):
    """The function use to check permissions

    :param callable view: the view
    :param list view_args: view args
    :param dict view_kwargs: view kwargs
    :param list args: decorator args
    :param dict kwargs: decorator kwargs
    """

注:

Flask-REST-JSONAPI利用装饰器has_permission,来为每个方法检查权限。我们能给装饰器提供args和kwargs,这样,我们就能在permission_manager中获取args和kwargs了。默认情况下,权限系统不会给装饰器,提供任何的args或kwargs。

当发生权限不足的情况,建议使用以下方式抛出异常。

raise JsonApiException(<error_source>,
                       <error_details>,
                       title='Permission denied',
                       status='403')

我们能为某个资源禁用权限系统,或者,定制权限检查的方式,如下:

from flask_rest_jsonapi import ResourceList
from your_project.extensions import api

class PersonList(ResourceList):
    disable_permission = True

    @api.has_permission('custom_arg', custom_kwargs='custom_kwargs')
    def get(*args, **kwargs):
        return 'Hello world !'

警告:

如果我们要同时使用权限系统和oauth支持,比如在权限系统下,从oauth读取用户信息(requests.oauth.user)。我们必须先初始化oauth,再初始化权限系统,因为装饰器检查是串联执行的。

例:

from flask import Flask
from flask_rest_jsonapi import Api
from flask_oauthlib.provider import OAuth2Provider
from your_project.permission import permission_manager

app = Flask(__name__)
oauth2 = OAuth2Provider()

api = Api()
api.init_app(app)
api.permission_manager(permission_manager) # initialize permission system first
api.oauth_manager(oauth2) # initialize oauth support second