用于添加对石墨烯的字段权限支持的包
graphene-field-permission的Python项目详细描述
为Graphene Python添加字段级权限的包。
目前只支持django/Graphene Django,但会 欢迎请求添加对其他orms的支持。
用法
查询
在架构节点上,将decorator@has_field_access添加到解析 对于任何要检查的字段。
架构文件中的用法示例:
fromgraphene_field_permission.decoratorsimporthas_field_accessclassGroupNode(DjangoObjectType):@has_field_access('permission1')defresolve_group_name(self,info):returnself.nameclassMeta:model=Group...
显示检查多个(无限)权限之一的示例:
fromgraphene_field_permission.decoratorsimporthas_field_accessclassGroupNode(DjangoObjectType):@has_field_access('permission1','permission2')defresolve_group_description(self,info):returnself.description
显示检查组下多个权限之一的示例, 对于权限因组ID不同的情况:
fromgraphene_field_permission.decoratorsimporthas_field_accessclassGroupNode(DjangoObjectType):@has_field_access('permission1','permission2',filter_field='group_id')defresolve_group_text(self,info):returnself.text
过滤字段
在上面的示例中,filter_field值为'group\u id' 在groupnode group_id字段。为相关的添加.分隔符 目标
filter_field处理将根据需要遍历相关对象 以减少查询的数量。
建议尽量减少。例如,使用 group.division.corporation\u id而不是group.division.corporation.id
@has_field_access('permission1','permission2',filter_field='group.division.corporation_id')
突变
添加check_field_access()调用以获取要确认的权限 -每次突变检查一次就可以了。如果不匹配,则引发权限错误 找到了。权限参数是逻辑或。
fromgraphene_field_permissionimportcheck_field_accessclassModifyGroup(graphene.Mutation):# Normal mutation setup here...defmutate(self,info,id,field_1_data,field_2_data):d=ORM.objects.find(pk=id)d.field_1=field_1_data# checking of permissions:try:check_field_access('permission1',info_context=info.context)d.protected_field=field_2_dataexceptPermissionErrorasexc1:raiseExceptionfromexc1d.save()
分组权限
fromgraphene_field_permissionimportcheck_field_accessclassModifyGroup(graphene.Mutation):# Normal mutation setup here...defmutate(self,info,id,field_1_data,field_2_data):fd=ModelName.objects.find(pk=id)fd.field_1=field_1_data# checking of permissions:try:# check for user having permission1 OR permission2check_field_access('permission1','permission2',filter_field='group.division.corporation_id',filter_data=fd,info_context=info.context,)fd.protected_field=field_2_dataexceptPermissionErrorasexc1:raiseExceptionfromexc1fd.save()
filter_field与filter_data的工作方式相同 filter_field在查询中执行,而filter_data提供orm 要遍历的对象。
可以进行和检索多个check_field_access()调用 两次调用之间将保留权限。
来自查询装饰器的graphql输出中的示例结果:
{"errors":[{"message":"No access for user on field 'group_name'","locations":[{"line":7,"column":9}],"path":["group","edges",0,"node","groupName"]}],"data":{"group":{"edges":[{"node":null}]}}}
使用说明:
- 如果用户尝试访问
他们无法进入。原因是
graphene django不允许为下列字段返回None。
不可设置为空,因此这是处理和
始终遵循这一惯例。所以有必要
graphql查询的粒度足够细,不需要调用
第一名。
- 建议客户端检查权限,以便 首先限制字段在查询中的访问。
安装
pip install graphene-field-permission
设置
- 按照自己的指示设置graphene和graphene django。
- 创建一个模块和方法,该模块和方法将返回 用户如下所示。默认情况下,列表和包含列表的dict 得到支持。
- 更新settings.py以匹配以下说明。
示例权限解析
标准:
defget_user_permissions(user):# query database to determine the passed in user's permissionsreturn['permission1','permission2','permission3']
或分组:
defget_user_permissions(user):# query database to determine the passed in user's permissionsreturn{'group-id-123':['permission1','permission2','permission3'],'group-id-456':['permission1','permission3','permission5'],}
用户权限呼叫信息
- 每个graphql查询调用调用一次。
- 建议使用日志尽量减少
此函数生成的查询。理想情况下最好这样做
在一个查询中。
- 建议对查询使用django orm的select_related。
如有必要,尽量减少查询次数。
设置
使用app/helpers/user_permissions.py上的上述方法(例如) 更新settings.py以添加:
GRAPHENE_FIELD_PERMISSION={'SRC_MODULE':'app.helpers.user_permissions','SRC_METHOD':'get_user_permissions',}
同时更新主石墨烯设置以添加中间件。
GRAPHENE={'MIDDLEWARE':['graphene_field_permission.permissions.PermissionsMiddleware']}
未来更新,设计说明
- 我不打算把这个发展得更深入。它划伤了我的 现在很痒。
- 我试了四种不同的方法来解决这个问题 必要,但发现这是最好的平衡 模式可定义且可执行。如果有人 能想出更好的办法。
- 这目前只支持django下的石墨烯。我愿意接受 其他人则添加了对其他graphene python项目的支持,如果希望 提交请求。