Django:基于模型实例属性的权限

Posted

技术标签:

【中文标题】Django:基于模型实例属性的权限【英文标题】:Django: permissions based on property of model instance 【发布时间】:2019-03-24 06:58:51 【问题描述】:

假设我有以下模型:

from django.db import models


class Environment(models.Model):
    name = models.CharField(max_length=30, unique=True)


class Device(models.Model):
    # (some other fields)
    environment = models.ForeignKey(Environment, on_delete=models.CASCADE)

还有两个“权限级别”:

root:该级别的用户可以编辑和删除Devices regular_user:该级别的用户可以查看Devices

指定Environment 的每个用户都应具有rootregular_user 权限级别,即。在环境 A 中,他可以是 root,在环境 B 中 - regular_user

为了指定用户对所选环境具有一定的权限级别,我使用here 描述的解决方案(<permission_level_name>:<environment_id>,例如:root:1)。如果有助于解决问题,这可能会有所更改。

用户通过基于 Django REST 框架的 API 访问数据。

如何防止环境A中具有root权限级别的用户编辑(通过API)环境B中具有regular_user权限级别的Devices

django-guardian 这样的解决方案允许为每个Device 实例分配权限,而Django Permissions 允许为每个模型分配权限,但我正在寻找的是基于Device 实例属性的权限系统。

【问题讨论】:

【参考方案1】:

您应该能够使用dry-rest-permissions 解决您的问题,它允许对权限、操作等进行细粒度控制

例子:

class Device(models.Model):
        # (some other fields)
        environment = models.ForeignKey(Environment, on_delete=models.CASCADE)

        def has_object_write_permission(self, request):
            return self.environment.is_root(request.user)

【讨论】:

看起来这个解决方案非常适合这个问题,谢谢!

以上是关于Django:基于模型实例属性的权限的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中通过字符串查找模型实例

如何根据链接到用户的模型(而不是基于用户组)设置 Django 权限?

将子类模型实例转换为 django 中的另一个子类模型实例?

如何在不定义内容类型或模型的情况下使用 Django 权限?

167.权限-添加权限的两种方式

将属性动态添加到 django 模型