通过相关对象权限的Django权限

问题描述

我是Django的新手,我正在寻找有关如何以某种方式设置权限的指南。基本上,我有一个应用程序,该应用程序包含几个与此相似的模型:

class Project(models.Model):
    name = models.CharField(max_length=100)
    users = models.ManyToManyField(CustomUser,related_name="projects")

class Task(models.Model):
    name = models.CharField(max_length=100)
    project = models.ForeignKey(Project,on_delete=models.CASCADE,related_name="tasks")

class Asset(models.Model):
    name = models.CharField(max_length=100)
    project = models.ForeignKey(Project,related_name="assets")

我的想法是,如果用户(通过M2M字段)被“分配”到一个项目,则该用户将有权访问与该项目相关的所有资产和任务。我已经针对每个对象的权限研究了 django-guardian ,我认为这可能是可行的方法,但是对我来说,我似乎必须在每个模型上设置这些权限。

感觉这应该是为任何基于项目的应用程序设置权限的一种非常普遍的方式,但是我很难找到类似的示例,并且开始怀疑我是否是对此进行了过度考虑或朝错误的方向发展?

谢谢, 乔纳斯(Jonas)

解决方法

您可以使用django-rules来利用对象级权限,而无需数据库;有了它,您可以在多个级别添加权限-模型,视图,模板,管理员或DRF。

因此,您需要创建一个像这样的谓词

<input ng-value="convertDate(line[column.dataKeyName])" type="date" ng-model="line[column.dataKeyName]" />

如果项目的管理员是给定的用户,则返回True,否则返回False。

然后,要将其添加到模型中,您将执行类似的操作

@rules.predicate
def is_project_manager(user,project):
     return project.users == user

还有其他一些注意事项,但我认为这是其工作原理的概述。