Как я могу структурировать разрешения Django для нескольких категорий групп разрешений? - PullRequest
0 голосов
/ 09 июля 2019

Я хотел бы иметь несколько уровней разрешений для API, использующего Django Rest Framework, как мне лучше всего этого добиться?

В частности, у меня есть три категории авторизации:

  • Роли: доступ на уровне модели, например, администратор и разные типы клиентов.
  • GroupAccess: для объекта, групповой доступ, например, для группы пользователей.
  • Чувствительность: для объекта, дополнительные тегидля конфиденциальной информации.

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

Идея 1:

Создайте модель для каждой категории, унаследованной от стандартной группы аутентификации django.Делать это в качестве прокси-групп, чтобы логически отличаться в моем коде, но максимально соответствовать стандартной авторизации.Затем используйте django-guardian, чтобы включить разрешения уровня объекта.

Идея 2:

Используйте стандартные группы для ролей и назначьте разрешения уровня модели на основе этих групп.Для разрешений на уровне объекта напишите пользовательские классы разрешений в Django Rest Framework, чтобы проверить разрешения на уровне объектов для пользователя.

1 Ответ

1 голос
/ 09 июля 2019

Я недавно спроектировал такую ​​архитектуру, поэтому первое, что пришло мне в голову, было бы так:

  1. Роли: Вы можете переопределить встроенный класс AbstractUser в django, добавив варианты на уровне ролей, такие как:
# models.py
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    """Custom user model with an extra type field"""
    SUPER_USER = 1
    OTHER_ROLE = 2
    SOME_OTHER_ROLE = 3

    USER_TYPE_CHOICES = (
        (SUPER_USER, 'Super user'),
        (OTHER_ROLE, 'Other role'),
        (SOME_OTHER_ROLE, 'Some other role'),
    )

    user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)

# -------------------------------------------------------------------------

# Don't forget to set this User model as your default model
# settings.py
AUTH_USER_MODEL = 'my_app.User'

  1. Вы можете использовать встроенную модель django Group, добавить ForeignKey к вашим Team моделям и сделать разрешение на уровне объекта вручную.
# models.py
from django.contrib.auth.models import Group
from django.db import models

def Team(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE)

# -------------------------------------------------------------------------

# You can do object-level permission per group by
# ...
if team.group in permitted_groups:
    # permission granted
    pass
else:
    # permission not granted
    pass
# ...
  1. Вы можете определить модель Tag и добавить ее в качестве ManyToManyField в свою модель конфиденциальной информации. Подобно второму решению, приведенному выше, вы можете вручную получить разрешение на уровне объекта во время выполнения, полагаясь на теги текущей информации.
...