【问题标题】:Django permissions via related objects permissions通过相关对象权限获得 Django 权限
【发布时间】:2021-02-14 23:31:23
【问题描述】:

我对 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, on_delete=models.CASCADE, related_name="assets")

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

感觉这应该是为任何基于项目的应用程序设置权限的一种非常常见的方式,但我很难找到类似的例子,并开始怀疑我是否过度思考或寻找错误的方向?

谢谢你, 乔纳斯

【问题讨论】:

    标签: python django django-models permissions django-guardian


    【解决方案1】:

    您可以使用django-rules 在没有数据库的情况下利用对象级权限;有了它,您可以在多个级别添加权限 - 模型、视图、模板、管理员或 DRF。

    所以,你需要创建一个谓词

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

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

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

    import rules
    from rules.contrib.models import RulesModel
    
    class Project(RulesModel):
        class Meta:
            rules_permissions = {
                "add": rules.is_project_manager,
                "read": rules.is_authenticated,
            }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2019-02-26
      • 2017-07-12
      相关资源
      最近更新 更多