【问题标题】:Django: permissions based on property of model instanceDjango:基于模型实例属性的权限
【发布时间】: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 实例属性的权限系统。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案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)

    【讨论】:

    • 看起来这个解决方案非常适合这个问题,谢谢!
    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多