【发布时间】:2021-07-29 22:04:20
【问题描述】:
我使用 Django 作为后端,graphene-django 服务于前端。我对 django 和石墨烯都是新手,所以我不确定在此设置中没有代码重复的情况下实现字段级权限的最佳方法是什么。例如,如果我的模型是:
class MyModel(models.Model):
field1 = models.CharField()
field2 = models.CharField()
我希望能够指定 user1 可以读取 field1 但 不能 field2;当 user1 为所有 MyModel 查询 GraphQL 时,它只允许从行(节点)而不是 field2 中检索 field1。
我做了一些研究,发现了 2 个可能的替代解决方案,但我担心它们可能不符合 Django 框架的精神和/或相互冲突,并且可能有更好的方法在 Django 中实现这一点。最终,我不想在 Django 和 Graphene 后端的多个部分重复权限代码,因此希望将其集中在尽可能低的级别,最好是在 Django 模型中。我需要能够根据 user_id 控制每个字段的完整 CRUD,甚至可能还有一些额外的逻辑。我发现的选项是:
-
在 graphene-django DjangoObjectType 中覆盖 get_node 解析器以检查那里的权限。我个人认为这是一个非常糟糕且不得已的解决方案,因为检查仅在 graphql 查询/突变层上完成,而不是在 Django 的其他地方。我可以轻松编写一个不会从权限检查中受益的 Django 表单或视图,除非在该表单/视图中再次对其进行编码。
-
我可以扩展 Django 模型以执行任意的每个字段检查,这似乎是强制执行权限检查的正确级别,但理想情况下,我更喜欢使用内置功能或“流行”库来处理此类内容。我尝试搜索一个库,但我找不到任何可以远程生产或获得任何牵引力的东西——这让我想到可能有更好的方法来解决这个问题。 Django-field-permissions 包似乎走在了正确的道路上。
我想知道是否有人对解决此问题的最佳方法有看法,该方法适合 Django 和 Graphene 框架,并且无需在任何地方重复权限代码?
【问题讨论】: