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

时间:2018-10-19 11:25:36

标签: django django-rest-framework

假设我具有以下模型:

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 Framework的API访问数据。

如何阻止环境A中拥有root权限级别的用户在环境A中拥有Devices权限的用户(通过API)编辑regular_user? / strong>

诸如django-guardian之类的解决方案允许为每个Device实例分配权限,而Django Permissions允许为每个Model分配权限,但是我要寻找的是基于Device实例的属性的权限系统。

1 个答案:

答案 0 :(得分:0)

您应该可以使用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)