Estaba usando el modelo de usuarios de Django para mi marco de descanso de Django. Para esto usé ModelViewSet de Django para mi clase de usuario.
class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializerSerializadores.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 userPero actualmente del cartero cuando realizo la solicitud usando el token de un usuario para ver, eliminar, editar otros usuarios
http://127.0.0.1:8000/api/users/4/Es capaz de editar/eliminar/ver otros usuarios. No quiero que eso suceda y un usuario puede hacer una solicitud por sí mismo solo es todo lo que quiero.
Esta es mi aplicación 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)), ]¿Cómo puedo evitar que un usuario acceda a otros usuarios cuando realizan una solicitud GET/POST/PUT/DELETE?
EDITAR 1: después de agregar la clase IsOwnerOfObject como se proporciona en las respuestas a continuación, ahora, cuando solicito los detalles del usuario, obtengo
No se proporcionaron las credenciales de autenticación.
Cree un archivo llamado permissions.py .
from rest_framework import permissions class IsOwnerOfObject(permissions.BasePermission): def has_object_permission(self, request, view, obj): return obj == request.userluego agregue la clase de permiso a su 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>]Más información aquí: https://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/#object-level-permissions
Si desea deshabilitar la eliminación por completo (lo que probablemente sea correcto, ya que si desea "eliminar" un usuario, debe desactivarlo en su lugar). Entonces puede reemplazar su vista con esto:
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 = UserSerializerY luego puede usar la respuesta de Ene Paul para limitar quién puede editar.
A partir de la respuesta de Ene, se deben proporcionar las clases de autenticación y permiso.
Cree un archivo llamado permisos.py.
from rest_framework import permissions class IsOwnerOfObject(permissions.BasePermission): def has_object_permission(self, request, view, obj): return obj == request.userluego agregue la clase de permiso y autenticación a 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,)