简单的图形-Django许可系统
graphene-permissions的Python项目详细描述
石墨烯权限
Graphene Django应用程序的权限系统。
概述
drf启发的基于graphene-django类的权限系统。允许轻松自定义权限类 用于查询和突变。
要求
- Python3.5+
- Django 2.0+
- 石墨烯django 2.0+
安装
使用pip安装:
pip install graphene-permissions
示例
< P>强制执行权限系统,添加适当的MIIN和设置属性^ {CD1>}。### models.pyfromdjango.dbimportmodelsclassPet(models.Model):name=models.CharField(max_length=32)race=models.CharField(max_length=64)
### schema.pyfromgrapheneimportrelayfromgraphene_djangoimportDjangoObjectTypefromgraphene_permissions.mixinsimportAuthNodefromgraphene_permissions.permissionsimportAllowAuthenticatedclassPetNode(AuthNode,DjangoObjectType):permission_classes=(AllowAuthenticated,)classMeta:model=Petfilter_fields=('name',)interfaces=(relay.Node,)
文档
设置权限检查
<查询>使用^ {< CD2>}并从^ {< CD3>}类继承。classAllowAuthenticatedPetNode(AuthNode,DjangoObjectType):permission_classes=(AllowAuthenticated,)classMeta:model=Petfilter_fields=('name',)interfaces=(relay.Node,)classAllowAuthenticatedFilter(AuthFilter):permission_classes=(AllowAuthenticated,)classPetsQuery:user_pet=relay.Node.Field(AllowAuthenticatedPetNode)all_user_pets=AllowAuthenticatedFilter(AllowAuthenticatedPetNode)
突变使用^ {CD4>}MIXIN。
classAuthenticatedAddPet(AuthMutation,ClientIDMutation):permission_classes=(AllowAuthenticated,)pet=graphene.Field(AllowAuthenticatedPetNode)classInput:name=graphene.String()race=graphene.String()owner=graphene.ID()@classmethoddefmutate_and_get_payload(cls,root,info,**input):ifcls.has_permission(root,info,input):owner=User.objects.get(pk=from_global_id(input['owner'])[1])pet=Pet.objects.create(name=input['name'],race=input['race'],owner=owner)returnAuthenticatedAddPet(pet=pet)returnAuthenticatedAddPet(pet=None)classPetsMutation:authenticated_add_pet=AuthenticatedAddPet.Field()
自定义权限类
默认权限类是:AllowAny
、AllowAuthenticated
、AllowStaff
。
您可以用一个类为查询和突变设置相等的权限,只需将这些类中的一个子类
若要限制对给定对象的访问,请重写相应的方法。如果应该给用户返回true
访问和false
,如果被拒绝。
classAllowMutationForStaff(AllowAuthenticated):@staticmethoddefhas_node_permission(info,id):# logic here # return boolean@staticmethoddefhas_mutation_permission(root,info,input):ifinfo.request.user.is_staff:returnTruereturnFalse@staticmethoddefhas_filter_permission(info):# logic here# return boolean
多重权限
您可以设置多个权限检查,只需添加更多类。对每个类计算权限。 如果其中一个检查失败,则拒绝访问。
classCustomPetNode(AuthNode,DjangoObjectType):permission_classes=(AllowAuthenticated,AllowStaff,AllowCustom)classMeta:model=Petinterfaces=(relay.Node,)