用于添加对石墨烯的字段权限支持的包

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_fieldfilter_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}]}}}

使用说明:

  1. 如果用户尝试访问 他们无法进入。原因是 graphene django不允许为下列字段返回None。 不可设置为空,因此这是处理和 始终遵循这一惯例。所以有必要 graphql查询的粒度足够细,不需要调用 第一名。
    1. 建议客户端检查权限,以便 首先限制字段在查询中的访问。

安装

pip install graphene-field-permission

设置

  1. 按照自己的指示设置graphene和graphene django。
  2. 创建一个模块和方法,该模块和方法将返回 用户如下所示。默认情况下,列表和包含列表的dict 得到支持。
  3. 更新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'],}

用户权限呼叫信息
  1. 每个graphql查询调用调用一次。
  2. 建议使用日志尽量减少 此函数生成的查询。理想情况下最好这样做 在一个查询中。
  3. 建议对查询使用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']}

未来更新,设计说明

  1. 我不打算把这个发展得更深入。它划伤了我的 现在很痒。
  2. 我试了四种不同的方法来解决这个问题 必要,但发现这是最好的平衡 模式可定义且可执行。如果有人 能想出更好的办法。
  3. 这目前只支持django下的石墨烯。我愿意接受 其他人则添加了对其他graphene python项目的支持,如果希望 提交请求。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Cassandra复制因子大于节点数   java J2EE JTA事务回滚不适用于OSE Glassfish 4.0(Build 89)   java spring安全预认证用户登录   org的java类文件。反应流。从RxJava编译示例时未找到Publisher?   java在使用dataFormat作为POJO通过Camel调用Web服务时无法设置SOAP标头   Javafx类的java静态实例   java如何防止一个部件在关闭时覆盖另一个部件的位置   sql server无法从我的java代码连接到数据库   java在JList(Swing)中显示带有的ArrayList   从Java中的CXF服务获取WSAddressing数据   使用资产文件夹进行java简单json解析(本地)   java LDAPException未绑定的无效凭据   JavaJSFspring部署到weblogic   JAVA中字符数组中的特定元素排列?   如果脚本位于不同的目录中,则ant不会使用exec标记运行Javashell脚本