Можно ли использовать сложную логику в классах разрешений DRF ViewSet?

В приложении, над которым я работаю, я бы хотел, чтобы для создания задачи для комитета вы должны быть членом комитета, главой комитета или пользователем admin, но вы также должны быть аутентифицированы. Я понимаю, что это можно сделать с помощью нескольких операторов OR, но в случае, если мне нужно что-то более сложное, я надеялся, что смогу использовать вложенные списки классов разрешений следующим образом:

permission_classes = [
                         IsAuthenticated & 
                         [
                             IsCommitteeHead | 
                             IsCommitteeMember | 
                             IsAdminUser
                         ]
                     ]

Будет ли этот синтаксис работать правильно, или rest_framework не понимает этого?

Да, из документации:

class ExampleView(APIView):
    permission_classes = [IsAuthenticated|ReadOnly]

Обратите внимание: он поддерживает & (и), | (или) и ~ (не).

Так что в вашем случае:

permission_classed = [IsAuthenticated & (IsCommitteeHead|IsCommitteeMember|IsAdminUser)]

Я думаю, что для управления доступом к представлениям следует использовать Django groups и perms в панели администратора.

Если бы у вас было это в коде, все было бы намного гибче:

from rest_framework.permissions import DjangoModelPermissions


class FullDjangoModelPermissions(DjangoModelPermissions):
    perms_map = {
        'GET': ['%(app_label)s.view_%(model_name)s'],
        'OPTIONS': ['%(app_label)s.view_%(model_name)s'],
        'HEAD': ['%(app_label)s.view_%(model_name)s'],
        'POST': ['%(app_label)s.add_%(model_name)s'],
        'PUT': ['%(app_label)s.change_%(model_name)s'],
        'PATCH': ['%(app_label)s.change_%(model_name)s'],
        'DELETE': ['%(app_label)s.delete_%(model_name)s'],
    }

А в классе view вот так:

class SomeAwuful(GenericAPIView):
    ...
    permission_classes = [FullDjangoModelPermissions]
    ...

Затем вы можете зайти в Django admin dashboard и установить, кто имеет доступ к чему, или создать группу для доступа к функциям, например, так:

enter image description here

Я действительно ненавижу жесткое кодирование и рекомендую вам изучить какой-нибудь способ, чтобы избежать жесткого кодирования всегда.

Вернуться на верх