Как разрешить пользователю изменять только свои данные в Django Rest Framework - PullRequest
0 голосов
/ 02 апреля 2019

Я создаю простой API с Django 2.1.8 и обеспечиваю безопасность с помощью Django OAuth Toolkit .Я достиг точки, когда пользователь может использовать API только после авторизации, но я хочу ограничить его действия только своими данными.

Я создал авторизацию, используя oauth2, которая возвращает мне токен доступа ,

models.py

class Client(AbstractUser):

    email = models.EmailField(
        verbose_name='email adress',
        max_length= 255,
        unique=True,
    )
    location = models.CharField(max_length=500, default="")

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    objects = ClientManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['location']

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

views.py

class SingleClientView(generics.RetrieveAPIView):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer
    permission_classes = [IsAuthenticated, TokenHasReadWriteScope]

Есть ли возможность подключить возвращенный токен к пользовательской модели, поэтому каждый раз, когда кто-то будет использовать его, APIфильтр, если пользователь соответствует требуемым данным?Или oauth toolkit автоматически и как получить к нему доступ?

1 Ответ

0 голосов
/ 02 апреля 2019

Вы должны добавить oauth2_provider.middleware.OAuth2TokenMiddleware в ваше промежуточное ПО в файле settings.py. Это автоматически прикрепит пользователя с запросом, к которому принадлежит токен, и вы можете получить к нему доступ с request, как request.user

Вы можете соответствующим образом изменить свое представление.

class SingleClientView(generics.RetrieveAPIView):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer
    permission_classes = [IsAuthenticated, TokenHasReadWriteScope]

    def get_object(self):
        return self.request.user
        # or any similar logic here..
...