DRF: создание пользовательских классов разрешений - PullRequest
0 голосов
/ 31 января 2020

Я разработал собственную RBAC system для своего Django приложения. В отличие от оригинальной Django на основе ролей, в которой используются только таблицы permissions, content_types, groups и users, я разработал мою так, чтобы она включала модель для определенной operations (то есть read, write, print), objects (то есть Post, Events, Documents), roles (Writer Level 1, Events Manager) и необходимые отношения, т.е. моя собственная таблица разрешений, которая принимает object reference и соответствующий operation reference (то есть Post | add ).

Моя проблема сейчас в том, что я не совсем уверен, как реализовать это в DRF. Когда я использую permission_class = (DjangoObjectPermissions,) и кто-то отправляет запрос 'POST' в модель / таблицу Post, мы все знаем, что Django проверит, имеет ли пользователь разрешение Can add post. Я тоже хочу это сделать, но хочу, чтобы Django ссылался на мои модели / таблицы RBA C.

Я хочу написать свои собственные классы разрешений в моем permissions.py, но мне может понадобиться немного подсказка о том, как это реализовать.

Я читал, что вы можете создавать собственные разрешения , но я не уверен, что это также означает, что вы можете использовать собственные таблицы RBA C с ним .

Ответы [ 2 ]

1 голос
/ 31 января 2020

В соответствии с разрешениями DRF c

Как и в случае DjangoModelPermissions, это разрешение должно применяться только к представлениям, имеющим .queryset свойство или .get_queryset() метод. Авторизация будет предоставлена ​​только в том случае, если пользователь прошел аутентификацию и ему назначены соответствующие разрешения для каждого объекта и соответствующие разрешения модели.

Таким образом, вы должны определить либо атрибут queryset, либо get_queryset(...) в вашем классе просмотра.

Пример:

class MyViewClass(viewsets.ModelViewSet):
    <b>queryset = SomeModel.objects.all()</b>
    ...
    ...
    ...

    <b>def get_queryset(self):
        return SomeModel.objects.filter(some_field='foo')</b>

    ...
    ...
    ...

Полномочиями для пользователя или групп можно управлять с помощью Django ' Администратор сайта, а также Django shell

0 голосов
/ 31 января 2020

Ладно, после проверки rest_frameworks 'permissions.py, я думаю, что смогу применить свое поведение класса разрешений следующим образом:

  1. Создать пользовательский класс разрешений, который подклассов rest_framework.permissions.BasePermission
  2. переопределить has_object_permission() метод
  3. Внутри метода написать лог c, который отображает запрашивающего пользователя в мои пользовательские модели RBA C, чтобы проверить, дал ли он соответствующее разрешение
  4. Вернуть соответствующий логический
...