Django rest frameowrk : Запретить одному пользователю удалять/редактировать/просматривать других пользователей в ModelViewSet

Я использовал модель пользователей Django для моего фреймворка Django rest. Для этого я использовал Django's ModelViewSet для моего класса User.

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

Serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'password']

        extra_kwargs = {
            'password' : {
                'write_only':True,
                'required': True
            }
        }
    
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        Token.objects.create(user=user) # create token for the user
        return user

Но в настоящее время из postman, когда я делаю запрос, используя токен одного пользователя для просмотра, удаления, редактирования других пользователей

http://127.0.0.1:8000/api/users/4/

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

Это мое приложение urls.py

urls.py

from django.urls import path, include
from .views import ArticleViewSet, UserViewSet
from rest_framework.routers import DefaultRouter


router = DefaultRouter()
router.register('articles', ArticleViewSet, basename='articles')
router.register('users', UserViewSet, basename = 'users')


urlpatterns = [
    path('api/', include(router.urls)), 
]

Как запретить одному пользователю доступ к другим пользователям, когда они делают запрос GET/POST/PUT/DELETE.

Создайте файл с именем permissions.py.

from rest_framework import permissions


class IsOwnerOfObject(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):

        return obj == request.user

далее добавьте класс разрешения в ModelViewSet:

from yourapp.permissions import IsOwnerOfObject

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    permission_classes = [IsOwnerOfObject, <other permission classes you want to use>]

Больше информации здесь: https://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/#object-level-permissions

Если вы хотите полностью отключить удаление (что, вероятно, правильно, так как если вы хотите "удалить" пользователя, вам следует деактивировать его). Тогда вы можете заменить ваше представление на следующее:

from rest_framework import viewsets
from rest_framework import generics

class UserViewSet(
    generics.CreateModelMixin,
    generics.ListModelMixin,
    generics.RetrieveModelMixin,
    generics.UpdateModelMixin,
    generics.viewsets.GenericViewSet
):
    queryset = User.objects.all()
    serializer_class = UserSerializer

И тогда вы можете использовать ответ Ene Paul, чтобы ограничить, кто может редактировать.

Основываясь на ответе Ene, необходимо добавить классы аутентификации и разрешения.

Создайте файл с именем permissions.py.

from rest_framework import permissions

class IsOwnerOfObject(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj == request.user

далее добавьте класс разрешения и аутентификации в ModelViewSet:

from api.permissions import IsOwnerOfObject
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    permission_classes = [IsAuthenticated, IsOwnerOfObject]
    authentication_classes = (TokenAuthentication,)
Вернуться на верх