【发布时间】:2020-06-23 16:02:48
【问题描述】:
上下文
我的 API 接受一个 jwt-token,我可以将其传递给外部端点,如果无效/过期,它将返回 401,如果仍然有效,则返回用户信息。基于此,我将返回 401 或属于用户的过滤数据。此外,POST 请求需要涉及写入该资源属于谁以使 GET 工作。我试图通过覆盖 get_queryset 和 perform_create 方法来做到这一点。
我的视图集看起来像这样:
class ReportViewSet(AuthorizedUserBasedFilteredViewset):
queryset = Report.objects.all()
serializer_class = ReportSerializer
def perform_create(self, serializer):
try:
username = self.get_authorized_user()['user']['username']
except Exception as e:
return Response({'error': 'Token does not exist'}, status=HTTP_401_UNAUTHORIZED)
serializer.save(creatd_by=username)
def get_queryset(self):
try:
username = self.get_authorized_user()['user']['username']
except Exception as e:
return Response({'error': 'Token does not exist'}, status=HTTP_401_UNAUTHORIZED)
return Report.objects.filter(created_by=username)
这不起作用,因为 get_queryset 需要一个查询集作为响应。
问题
- 如何在 get_queryset 中冒泡授权异常?是否有其他方法我应该完全覆盖身份验证?我仍然需要将收到的用户名传递给 get_queryset 才能成功进行身份验证
- 有没有更好的方法来做到这一点?我觉得调用外部身份验证 API 并将用户设置为可由 get_queryset 和 perform_create 方法访问,理想情况下会转到代码中的其他位置。我查看了 RemoteUserAuthenticationBackend,但仍然涉及创建用户对象,但对于这个用例,用户模型完全是外部的
【问题讨论】:
标签: django authentication django-rest-framework jwt django-authentication