如何允许用户只修改他在 Django Rest Framework 中的数据

How to allow user to modify only his data in Django Rest Framework

我正在使用 Django 2.1.8 构建简单的 API 并使用 Django OAuth 工具包 提供安全性。我已经达到用户只能在授权后使用 api 的地步,但我想将他的行动限制在他的数据上。

我已经使用 returns 我 访问令牌 的 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 工具包是否自动以及如何访问它?

您必须在 settings.py 文件中的中间件中添加 oauth2_provider.middleware.OAuth2TokenMiddleware。这将自动为用户附加令牌所属的请求,您可以从 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..