Django Graphene/GraphQL模型字段级权限的最佳设计
我使用Django作为后端,石墨烯Django作为前端。我对django和graphene都是新手,所以我不确定在这种设置中实现无代码重复的字段级权限的最佳方法是什么。例如,如果我的模型是: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时
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,甚至可能有一些额外的逻辑。我找到的选择是:
我想知道是否有人对解决这个问题的最佳方法有看法,这种方法适合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 /
- ...
这样,您就可以使用标准的内置权限来拒绝对整个表的访问(如上所示),并使用对象级权限(,)来拒绝对当前医生之外的所有真正机密内容的访问
希望这对你有帮助,祝你好运 谢谢-这真的很有帮助,也呼应了我的想法!它认为基于权限拆分对象是最简单的方法