Django: разрешения, основанные на свойстве экземпляра модели - PullRequest
0 голосов
/ 19 октября 2018

Предположим, у меня есть следующие модели:

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.

. Для указания того, что пользователь имеет определенный уровень разрешений для выбранной среды, я использую решение, описанное здесь (<permission_level_name>:<environment_id>, например: root:1).Это может быть изменено, если это поможет решить проблему.

Пользователь обращается к данным через API на основе Django REST Framework.

Как запретить пользователю использовать rootуровень разрешений в среде A для редактирования (через API) Devices, которые находятся в среде B, где он имеет regular_user уровень разрешений?

Решения типа django-guardian позволяют назначать разрешения для * 1039Разрешения * instance и Django позволяют назначать разрешения для каждой модели, но мне нужна система разрешений, основанная на свойстве Device instance.

1 Ответ

0 голосов
/ 19 октября 2018

Вы должны быть в состоянии решить вашу проблему с разрешениями на сухой отдых Это обеспечивает точный контроль над разрешениями, действиями и т. Д.

Пример:

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

        <b>def has_object_write_permission(self, request):
            return self.environment.is_root(request.user)</b>
...