Я пытаюсь обновить профиль и статус, если его собственный профиль и статус.Но пользователь может обновлять чужой профиль и статус - PullRequest
0 голосов
/ 03 февраля 2019

Спасибо, ребята, все заранее.Надеемся на скорый ответ.

** view.py *

class UserViewSet(viewsets.ModelViewSet):
    """ API endpoint that allows users to be viewed or edited. """

    serializer_class = UserSerializer
    queryset = UserRegister.objects.all()
    authentication_classes = (TokenAuthentication,)
    permission_classes = (permissions.UpdateRegister,)

class ProfileFeedViewSet(viewsets.ModelViewSet):
    """ Handles creating reading and updating profile feed. """

    serializer_class = ProfileFeedSerializer
    queryset = ProfileFeed.objects.all()
    authentication_classes = (TokenAuthentication,)
    permission_classes = (permissions.PostOwnStatus, IsAuthenticatedOrReadOnly)

    def perform_create(self, serializer):
        """Sets the user profile to the logged in user."""

        serializer.save(user_profile=self.request.user)

Это файл view.py.Здесь у меня есть набор представлений пользователей и набор профилей

serializer.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserRegister
        fields = ('id', 'name', 'email', 'password')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        """ Create and return a new user"""

        user = UserRegister(
            email=validated_data['email'],
            name=validated_data['name'],
        )
        user.set_password(validated_data['password'])
        user.save()

        return user

class ProfileFeedSerializer(serializers.ModelSerializer):
""" Serialzer for profile feed. """

    class Meta:
     model = ProfileFeed
     fields = ('id', 'user_profile', 'post', 'created_on')
     extra_kwargs = {'user_profile': {'read_only':True}}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Насколько мне известно, вам не нужно добавлять собственные классы разрешений для этого.

Вы можете удалить permission_classes из ваших ViewSets.Вместо этого переопределите get_permissions() и условно определите разрешения в ваших наборах представлений:

def get_permissions(self):

    pk = self.kwargs['pk'] if 'pk' in self.kwargs else ''
    is_myself = self.request and self.request.user and pk == str(
            self.request.user.id)

    # define your own logic here
    if is_myself and self.action != 'destroy':
        permission_classes = [permissions.IsAuthenticated]
    elif (self.action == 'list' or self.action == 'retrieve'):
        permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    else:
        permission_classes = [permissions.IsAdminUser]
    return [permission() for permission in permission_classes]

Возможно, вы захотите написать эти условия в соответствии с вашими потребностями.

См. Руководство api DRF

0 голосов
/ 03 февраля 2019

Ваши методы класса разрешений возвращают True перед сопоставлением с пользователем.Попробуйте изменить условие на это:

if request.method in permissions.SAFE_METHODS and obj.id == request.user.id:
    return True
...