django-rest-framework - 如何以安全的方式为 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
解决方案
对我来说,您似乎已经实现了您的目标 - 您在get_queryset
. 这是我们的实现,Djoser
其中是最流行的 DRF REST Auth lib。
请注意,我们有/me
一个非常常见的端点,用于询问“你自己”。有关更多信息,请查看在 REST 应用程序问题中为当前登录用户设计 URI 。
无论如何,与用户相关的一切通常都很奇怪。如果我试图实现你所做的事情,我可能会加注NotFound
,get_queryset
因为实际上你不需要它。
user
如果您的目标是在他请求没有 GET资源时返回用户数据pk
,那么类似的东西应该可以
def list(self, request, *args, **kwargs):
serializer = self.serializer_class(self.request.user)
return Response(serializer.data)
并且 afaikcreate
不需要queryset
. 对于用户名/邮件重复,在序列化程序中添加验证器。
推荐阅读
- powershell - PowerShell SecureBoot 检测脚本
- python - 让 Mypy 对固定/最大长度序列感到满意
- git - 如何从远程分支“someBranch”拉到本地分支“sonOfSomeBranch”?
- sql-server - 将数据类型 varchar 转换为数字时出错。在下面的 sql 查询中
- java - 如何使用java将地图数据列表构建为分层父子关系
- nginx - 无法在 nginx 中读取自签名证书
- javascript - 使用 JavaScript 模拟/调用 .mouseover 事件
- json - 如何在 Flutter 中序列化一个抽象类?
- javascript - CORB:JSFiddle 上的跨域读取阻塞
- reactjs - 在按钮上调用 setState 后反应错误无法 POST /TrajetBus