Django Graphene/GraphQL模型字段级权限的最佳设计

Django Graphene/GraphQL模型字段级权限的最佳设计,django,graphene-django,Django,Graphene Django,我使用Django作为后端,石墨烯Django作为前端。我对django和graphene都是新手,所以我不确定在这种设置中实现无代码重复的字段级权限的最佳方法是什么。例如,如果我的模型是: class MyModel(models.Model): field1 = models.CharField() field2 = models.CharField() 我希望能够指定user1可以读取field1,但不能读取field2;当user1为所有MyModels查询GraphQL时

我使用Django作为后端,石墨烯Django作为前端。我对django和graphene都是新手,所以我不确定在这种设置中实现无代码重复的字段级权限的最佳方法是什么。例如,如果我的模型是:

class MyModel(models.Model):
   field1 = models.CharField()
   field2 = models.CharField()
我希望能够指定user1可以读取field1,但不能读取field2;当user1为所有MyModels查询GraphQL时,只允许从行(节点)检索field1,而不允许从field2检索field1

我做了一些研究,发现了两种可能的替代解决方案,但我担心它们可能不符合Django框架的精神和/或相互冲突,Django可能有更好的方法来实现这一点。最终,我不想在Django和Graphene后端的多个部分重复权限代码,所以希望将其集中在尽可能低的级别上,最好是在Django模型上。我需要能够根据用户id控制每个字段的完整CRUD,甚至可能有一些额外的逻辑。我找到的选择是:

  • 重写graphene django DjangObjectType中的get_节点解析器以检查其中的权限。我个人认为这是一个非常糟糕的最后解决方案,因为检查只在graphql查询/变异层上进行,而不是在Django的其他地方。我可以很容易地编写一个Django表单或视图,除非在该表单/视图中再次编码,否则它不会从权限检查中受益

  • 我可以扩展Django模型来执行任意的每字段检查,这似乎是执行权限检查的正确级别,但理想情况下,我更喜欢使用内置功能或“流行”库来执行这类检查。我试图寻找一个图书馆,但我找不到任何东西,甚至远程生产准备或获得任何牵引-这使我认为,可能有更好的方法来解决这个问题。不过,这个包裹似乎走上了正确的道路


  • 我想知道是否有人对解决这个问题的最佳方法有看法,这种方法适合Django和Graphene框架,并且不需要到处重复权限代码?

    您不会找到一个稳定/流行的包来解决这个问题,因为它不是一个数据库可以很好支持的设计

    不能链接(外键)字段和表,只能使用字段链接两个表。因此,确定表中的一行是否可以访问另一个表中的字段的任何工作都将代价高昂且容易出错

    您所能做的最好的事情就是编写一个服务层,该服务层位于解析器和模型之间,该模型将清空用户无权访问的字段。您将其传递给用户(
    info.context.user
    )和一个模型,它对字段权限模型执行单独的查询,获取记录并根据权限将每个字段置为空

    这本质上意味着为了支持权限,每个字段都需要为空,这使前端变得复杂-这需要大量的工作

    如果您的业务逻辑允许,更好的方法是将这些字段分组到模型中,然后将这些模型绑定到“角色”或组。如果这是医院的医疗数据:

    - name  ----- \
    - address     | -> Person model => all personnel, except custodial
    - birth date -/
    - medication -------\
    - patient history   | => PatientStatus model => all medically trained personnel
    - current physician /
    - ...
    
    这样,您就可以使用标准的内置权限来拒绝对整个表的访问(如上所示),并使用对象级权限(,)来拒绝对当前医生之外的所有真正机密内容的访问


    希望这对你有帮助,祝你好运

    谢谢-这真的很有帮助,也呼应了我的想法!它认为基于权限拆分对象是最简单的方法