权限¶
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