Каков наилучший способ реализации аутентификации по операциям и по строкам, если есть что-то вроде этого - PullRequest
0 голосов
/ 29 марта 2020

Я создаю проект с использованием DRF (Django Rest Framework), я застрял в момент обновления данных в таблицах и считаю, что он очень уязвим для неправильного использования. Мой код ниже

models.py

from django.db import models
from Mera.settings.common import AUTH_USER_MODEL
from Mera.constant import UNIT_TYPES


class Item(models.Model):
    owner = models.ForeignKey(AUTH_USER_MODEL, related_name='item_owner', null=True, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=100)
    previous_code = models.CharField(max_length=100, blank=True, default="")
    short_name = models.CharField(max_length=100, blank=True, default="")

serializers.py

from rest_framework import serializers
from commodity.models import Item
from Mera.settings.common import AUTH_USER_MODEL


class ItemSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        return Item.objects.create(**validated_data)

    def update(self, instance, validated_data):
        # instance.name = validated_data.get('name', instance.name)
        instance.save()
        return instance

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['owner'] = UserSerializer(instance.owner).data
        return response

    class Meta:
        model = Item
        fields = '__all__'

class UserSerializer(serializers.ModelSerializer):
    items = serializers.PrimaryKeyRelatedField(many=True, queryset=Item.objects.all())

    class Meta:
        model = AUTH_USER_MODEL
        fields = ['id', 'username', 'items']

просмотров .py

from rest_framework import generics
from rest_framework import mixins
from django.contrib.auth.models import User
from commodity.models import Item
from commodity.serializers import ItemSerializer, UserSerializer

class ItemList(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

class ItemDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

Я сомневаюсь, что если кто-то получит метод API и формат данных из dev-tools и использует собственную аутентификацию, он / она сможет измениться ( ОБНОВЛЕНИЕ) данных любой строки, просто изменив id (первичный ключ) в запросе, таким образом, они могут изменить данные всей таблицы, даже если у них есть роль для этого или нет ,

Также, аналогично, если кто-то удаляет id (первичный ключ) из запроса, instance.save () может создать новую строку, даже из API обновления.

Пожалуйста, DRF, Django Руководство сообщества, если я ошибаюсь, предоставьте мне лучший способ реализации аутентификации по операциям и по строкам, если есть что-то подобное.

1 Ответ

0 голосов
/ 29 марта 2020

Если вы хотите отключить создание объектов, не наследуйте от mixins.CreateModelMixin

Если вы хотите, чтобы объекты редактировались и просматривались только их владельцами, создайте класс разрешений и добавьте его в набор просмотра permission_classes

from rest_framework import permissions

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

class ItemDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    permission_classes [IsOwnerPermission]

Если вы хотите отключить создание объектов, не наследуйте от mixins.CreateModelMixin

Источники:

https://www.django-rest-framework.org/api-guide/permissions/

https://www.django-rest-framework.org/api-guide/generic-views/#createmodelmixin

...