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
的每个用户都应具有root
或regular_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 中的另一个子类模型实例?