如何以安全的方式为 UserList 设置权限 类

How to set permissions classes for UserList in a secure way

通过此实现,API 端点中的任何人都可以看到整个用户列表。例如,如果我将权限 类 更改为 IsAdmin,用户将无法访问他们自己的用户。仅 return 当前用户的安全方法是什么?是否可以在 get_queryset() 函数中过滤掉该用户?

class UserList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    serializer_class = UserSerializer

    permission_classes = [IsAuthenticatedOrReadOnly]

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

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

    def get_queryset(self):
        qs = get_user_model().objects.all()

        if self.request.user:
            # Return the currently logged in user
            status = self.request.query_params.get("user", None)
            if status and status == "current":
                qs = get_user_model().objects.filter(pk=self.request.user.pk)
            return qs

对我来说,您似乎已经实现了目标 - 您在 get_queryset 中进行了正确的过滤。这是我们在 Djoser 中的实现,它是 DRF 最流行的 REST Auth 库。

请注意,我们有 /me 端点,这对于询问“您自己”非常常见。有关详细信息,请查看 问题。

无论如何,与用户相关的一切往往都很奇怪。如果我试图实现你所做的,我可能会在 get_queryset 中提出 NotFound 因为实际上你不需要它。

如果您的目标是 return 用户数据,当他请求 GET user 资源而不 pk 时,类似的东西应该可以工作

    def list(self, request, *args, **kwargs):
        serializer = self.serializer_class(self.request.user)
        return Response(serializer.data)

并且 afaik create 不需要 queryset。对于 username/mail 重复,在序列化程序中添加验证器。