【问题标题】:How to set permissions classes for UserList in a secure way如何以安全的方式为 UserList 设置权限类
【发布时间】:2021-06-26 13:24:48
【问题描述】:

通过此实现,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-framework view permissions django-users


    【解决方案1】:

    在我看来,您似乎已经实现了目标 - 您在 get_queryset 中正确过滤。这是我们在Djoser 中的实现,这是最流行的 DRF REST 身份验证库。

    请注意,我们有 /me 端点,这在询问“你自己”时很常见。有关更多信息,请查看Designing URI for current logged in user in REST applications 问题。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      相关资源
      最近更新 更多