首页 > 解决方案 > 如何以安全的方式为 UserList 设置权限类

问题描述

通过此实现,API 端点中的任何人都可以看到整个用户列表。例如,如果我将权限类更​​改为 IsAdmin,则用户无权访问他们自己的用户。什么是只返回当前用户的安全方法?是否可以在 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

标签: django-rest-frameworkviewpermissionsdjango-users

解决方案


对我来说,您似乎已经实现了您的目标 - 您在get_queryset. 这是我们的实现,Djoser其中是最流行的 DRF REST Auth lib。

请注意,我们有/me一个非常常见的端点,用于询问“你自己”。有关更多信息,请查看在 REST 应用程序问题中为当前登录用户设计 URI 。

无论如何,与用户相关的一切通常都很奇怪。如果我试图实现你所做的事情,我可能会加注NotFoundget_queryset因为实际上你不需要它。

user如果您的目标是在他请求没有 GET资源时返回用户数据pk,那么类似的东西应该可以

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

并且 afaikcreate不需要queryset. 对于用户名/邮件重复,在序列化程序中添加验证器。


推荐阅读