Django Rest框架:通过令牌登录获取用户详细信息和权限

Django Rest框架:通过令牌登录获取用户详细信息和权限,django,django-rest-framework,Django,Django Rest Framework,My(Angular)frontend通过提供的jwt_视图执行jwt登录到Django Rest框架后端。TokenActainPairView类 但是,这只返回访问和刷新令牌,实际上我希望获得更多,例如用户名和用户拥有的权限(这样前端可以隐藏或禁用用户无论如何都不能使用的任何功能) 实现这一目标的最佳解决方案是什么 写我自己的令牌生成视图 子类化现有视图并用获取用户信息的序列化程序覆盖序列化程序 是否使用其他方法传输权限或登录 Django中发生的“魔力”让我很困惑,我可以设置和覆盖哪些

My(Angular)frontend通过提供的
jwt_视图执行jwt登录到Django Rest框架后端。TokenActainPairView

但是,这只返回访问和刷新令牌,实际上我希望获得更多,例如用户名和用户拥有的权限(这样前端可以隐藏或禁用用户无论如何都不能使用的任何功能)

实现这一目标的最佳解决方案是什么

  • 写我自己的令牌生成视图
  • 子类化现有视图并用获取用户信息的序列化程序覆盖序列化程序
  • 是否使用其他方法传输权限或登录

Django中发生的“魔力”让我很困惑,我可以设置和覆盖哪些参数和值。

是的,您需要将
TokenActainPairView
以及
TokenActainPairSerializer
子类化

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView


class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        attrs = super().validate(attrs)
        return {
            "username": self.user.username,
            "email": self.user.email,
            "permissions": self.user.user_permissions.values_list("codename", flat=True),
            "groups": self.user.groups.values_list("name", flat=True),
            **attrs,
        }


class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer
从rest\u framework\u simplejwt.serializer导入TokenActainPairSerializer
从rest\u framework\u simplejwt.views导入TokenObtainPairView
类MyTokenOcctainPairSerializer(TokenOcctainPairSerializer):
def验证(自身、属性):
attrs=super().validate(attrs)
返回{
“用户名”:self.user.username,
“电子邮件”:self.user.email,
“权限”:self.user.user\u permissions.values\u list(“代码名”,flat=True),
“组”:self.user.groups.values_列表(“name”,flat=True),
**属性,
}
类MyTokenActainPairView(TokenActainPairView):
serializer_class=MyTokenActainPairSerializer
您可以通过调用self.user访问序列化程序中经过身份验证的用户,因此您可以通过self.user.user\u permissions.all()访问他们的权限


另外,不要忘记将新的视图类连接到
url.py

您使用的是什么包?
rest\u framework\u simplejwt
这很好。也许是一个后续问题,因为我似乎找不到关于它的最佳实践信息。您通常会让前端检查权限/组信息以决定显示哪些功能吗?我会选择这种方式。