限制Graphene Django上的字段权限

41zrol4v  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(98)

假设我有一个用户类型

class UserType(DjangoObjectType):
    class Meta:
        model = User
        fields = [
            "fieldA",
            "fieldB",
            "relationshipA",
            "relationshipB"
        ]

字符串
我希望fieldBrelationshipB只对所有者(用户)可见。
要做到这一点,最佳策略是什么?
最初,我创建了一个PublicUserType,不包括私有字段,但很快我意识到它可能是不可伸缩的,因为我不仅必须为UserType创建私有表示,我还可能为任何关系(relationshipA等)创建私有表示,并创建适当的解析器和重复片段等。
这里是否有最佳实践?

fslejnso

fslejnso1#

我的解决方案是:
创建decorators.py文件

from functools import wraps
from graphql import GraphQLError
from api.utils import snake_to_camel_case

def private_field(func):
    @wraps(func)
    def wrapper(self, info):
        user = info.context.user

        if user.id != self.id:
            field_name = func.__name__.replace('resolve_', '')
            field_name_camel_cased = snake_to_camel_case(field_name)
            raise GraphQLError(f'You do not have permissions to access {field_name}')
        
        return func(self, info)
    return wrapper

字符串
snake_to_camel_case函数:

def snake_to_camel_case(string):
    components = string.split('_')
    return components[0] + ''.join(x.title() for x in components[1:])


最后在我的模式文件解析器上:

@private_field
    def resolve_private_field(self, info):
        return self.private_field


响应应该是这样的:

{
    "errors": [
        {
            "message": "You do not have permissions to access privateField",
...


现在显然这个解决方案是超级具体为我的需要atm但它应该很容易足够使它更通用和可扩展的任何情况。

相关问题