如何根据 Django Rest 框架中的 JWT 有效负载覆盖 GET 方法?



首先,我希望这个问题的标题足够清楚。如果不是这种情况,以下几行将使事情更加清晰。

我的数据库中有不同的用户。有些是员工的一部分,有些只是普通用户。 在我的 API 中,我有一个/users 路由。我的想法是,当工作人员请求它(GET(时,他将只看到员工用户,当普通用户请求它时,他只会看到普通用户。

发出请求的用户是否是工作人员是存储在JWT令牌中的信息。 因此,我使用了以下代码:

class CustomUserList(generics.ListCreateAPIView):
serializer_class = CustomUserSerializer
def get_queryset(self):
token = self.request.META.get('HTTP_AUTHORIZATION')[7:] # [7:] to get rid of 'Bearer '
is_staff = jwt.decode(token, None, None)['is_staff']
print(is_staff)
queryset = CustomUser.objects.filter(is_staff=is_staff)
return queryset

这段代码有效,但有没有更直接/合乎逻辑的方法来完成它?

感觉有点不习惯在客户端存储本质上是服务器端权限/设置的内容(即使有些人确实为此使用 JWT(。如果用户被提升为员工/从员工降级怎么办?您必须撤销所有此类客户端令牌?此外,如果需要向这些查询附加更多条件,该怎么办?

我认为一种稍微灵活的方法是在 JWT 令牌中存储某种用户 ID,然后使用带有 JWT 的TokenAuthentication类来建立用户的身份,将其附加到类似request.user的东西,然后在您的get_queryset方法中按request.user.is_staff过滤。这样,您可以将任何上下文/筛选器/权限附加到服务器端经过身份验证的用户,而无需依赖客户端提供显式声明来筛选出他们可以访问的对象。您最终会额外调用数据库来填充request.user,但无论如何您最终都可能需要它。

在标头中使用 JWT 令牌进行身份验证会检索用户,以便您的视图可以访问dispatch()方法(向终结点发送请求时触发.as_view()后运行的第一个方法(之后的每个方法中的request.user和所有用户属性。

如果你使用的是 djangorestframework-simplejwt,DRF 推荐的 JWT 包,你需要做的就是:

class CustomUserList(generics.ListCreateAPIView):
queryset = CustomUser.objects.all()
serializer_class = CustomUserSerializer
def get_queryset(self):
queryset = super().get_queryset()
if self.request.user.is_staff:
queryset = queryset.filter(is_staff=True)
return queryset

相关内容

最新更新