使用 REST framework JWT 时更改默认用户
Changing the default user while using REST framework JWT
我有一个代理用户模型:
class TheDude(User):
class Meta:
proxy = True
我正在使用 Django REST 框架 JWT 在 REST 中进行 JWT 身份验证 API。
我想从请求中获取用户对象,但目前它是一个用户对象。因为它是代理我不能使用 AUTH_USER_MODEL
。我试过做一个中间件组件来覆盖请求中的用户,但它没有在那个阶段设置。我也试过使用 JWT_RESPONSE_PAYLOAD_HANDLER
但是我的函数没有被调用所以我也不能在那里设置它。
如果我想在我调用 request.user
而不是 User
时获得 TheDude
对象,我将如何在使用 REST 框架 JWT 进行授权时执行此操作授权库?
编辑
我已经添加了
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
...
'myapp.authentication.MyCustomJWTAuthentication',
)
...
}
我的settings.py和我的
class MyCustomJWTAuthentication(JWTAuthentication):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user_model = TheDude
调用正确,但是当我从序列化程序中的请求中获取用户时,它仍然是 User
类型,而不是 TheDude
class TestSerializer(serializers.ModelSerializer):
user_test = serializers.SerializerMethodField('get_user_test')
def get_user_test(self, obj):
print(type(self.context['request'].user))
应该可以通过覆盖 JWTAuthentication
身份验证 class 并将代理用户模型设置为 user_model
来使用代理模型,如下所示:
from rest_framework_simplejwt.authentication import JWTAuthentication
class MyCustomJWTAuthentication(JWTAuthentication):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user_model = TheDude
假设您在 myapp/authentication.py
上添加此 class,然后您可以将此自定义身份验证 class 作为默认身份验证 class 之一应用到您的 [=16] =] 设置:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'myapp.authentication.MyCustomJWTAuthentication',
...
)
...
}
或者仅将其应用于您想要的某些视图:
from myapp.authentication import MyCustomJWTAuthentication
class CertainAPIViewThatNeedsTheDude(APIView):
authentication_classes = (MyCustomJWTAuthentication, )
这应该反过来给你一个 request.user
是一个 TheDude
实例。
我有一个代理用户模型:
class TheDude(User):
class Meta:
proxy = True
我正在使用 Django REST 框架 JWT 在 REST 中进行 JWT 身份验证 API。
我想从请求中获取用户对象,但目前它是一个用户对象。因为它是代理我不能使用 AUTH_USER_MODEL
。我试过做一个中间件组件来覆盖请求中的用户,但它没有在那个阶段设置。我也试过使用 JWT_RESPONSE_PAYLOAD_HANDLER
但是我的函数没有被调用所以我也不能在那里设置它。
如果我想在我调用 request.user
而不是 User
时获得 TheDude
对象,我将如何在使用 REST 框架 JWT 进行授权时执行此操作授权库?
编辑
我已经添加了
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
...
'myapp.authentication.MyCustomJWTAuthentication',
)
...
}
我的settings.py和我的
class MyCustomJWTAuthentication(JWTAuthentication):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user_model = TheDude
调用正确,但是当我从序列化程序中的请求中获取用户时,它仍然是 User
类型,而不是 TheDude
class TestSerializer(serializers.ModelSerializer):
user_test = serializers.SerializerMethodField('get_user_test')
def get_user_test(self, obj):
print(type(self.context['request'].user))
应该可以通过覆盖 JWTAuthentication
身份验证 class 并将代理用户模型设置为 user_model
来使用代理模型,如下所示:
from rest_framework_simplejwt.authentication import JWTAuthentication
class MyCustomJWTAuthentication(JWTAuthentication):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user_model = TheDude
假设您在 myapp/authentication.py
上添加此 class,然后您可以将此自定义身份验证 class 作为默认身份验证 class 之一应用到您的 [=16] =] 设置:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'myapp.authentication.MyCustomJWTAuthentication',
...
)
...
}
或者仅将其应用于您想要的某些视图:
from myapp.authentication import MyCustomJWTAuthentication
class CertainAPIViewThatNeedsTheDude(APIView):
authentication_classes = (MyCustomJWTAuthentication, )
这应该反过来给你一个 request.user
是一个 TheDude
实例。