石墨烯场acl
graphene-acl的Python项目详细描述
石墨烯acl
这个库的目的是简化石墨烯场的访问控制保护。保护acl的一种常见方法是使用可重用的权限验证装饰器。问题是,对于使用标准解析器的石墨烯场来说,这很麻烦。您被迫编写一个不必要的解析器函数,以便用您的权限验证器对其进行注释。这个库解决的第二个麻烦问题是基于acl角色的解析器。根据用户角色的不同,您可能希望执行不同的业务逻辑,以便检索他们为Graphene字段请求的数据。
安装
$ pip install graphene-acl
用法
acl_分类器
分类器的目的是返回一个路由密钥,该密钥将用于确定哪个解析器函数用于解析字段。分类器函数可以访问字段解析器中的所有参数。
ACL验证器
验证器的目的是授权对字段的访问。此验证将在分类路由发生之前进行。如果每个分类路由的授权验证不同,则不应使用此验证器强制授权访问。相反,您应该在特定的分类器解析器定义处进行授权。
示例
fromgraphene_aclimportAclFieldimportgraphenedefclassifier(root,info,*args,**kwargs):if'admin'ininfo.context.jwt.permissions:return'admin'returnNonedefhas_permissions(permissions):defvalidator(root,info,*args,**kwars):if(any([permissionininfo.context.jwt.permissionsforpermissioninpermissions])):returnTrueraiseAuthorizationError(f'Not authorized to query field {info.field_name}')returnvalidatorclassFoo(graphene.ObjectType):private_name=AclField(graphene.String,acl_classifier=classifier)restricted_name=AclField(graphene.String,acl_validator=has_permissions(['foo:name:read','admin']))@Foo.private_name.resolve('admin')defresolve_private_name__admin(root,info,*args,**kwargs):pass@Foo.private_name.resolve()defresolve_private_name__default(root,info):# Alternatively, authorization handling could be done by an acl_validatorraiseError('Not Authorized')
ACL连接字段
fromgraphene_django.filterimportDjangoFilterConnectionFieldfromgraphene_aclimportacl_field_typeBarConnectionField=acl_field_type('BarConnectionField',DjangoFilterConnectionField)classFoo(graphene.ObjectType):bar=BarConnectionField(MyNode,acl_permissions=has_permission('FOO'))
开发
首次设置
- 安装预调试挂钩
brew install pre-commit && pre-commit install && pre-commit install --install-hooks
- 安装诗歌:https://github.com/sdispater/poetry#installation
curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
- 安装依赖项
poetry install