如何以安全的方式为 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 重复,在序列化程序中添加验证器。
通过此实现,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 重复,在序列化程序中添加验证器。