有没有办法在 django 中间件中编辑请求用户?
Is there any way to edit the request user in django middleware?
我正在创建一种方法,让超级用户可以控制另一个用户的帐户,但允许登录以显示此时执行的所有操作都是由超级用户完成的。
我目前的想法是在中间件中处理请求并寻找特定的header。如果 header 存在,我将用 header 中指定的用户替换当前的 request.user。目前中间件看起来像这样:
class ControlledUserMiddleware(MiddlewareMixin):
def process_request(self, request):
controlled_user = request.META.get('HTTP_CONTROLLED_USER', None)
if controlled_user:
request.user = User.objects.get(uuid=controlled_user)
我发现 - 尽管我已将它放在我的设置文件中的 auth 中间件之后 - 请求中的用户在到达此功能时始终是 'anonymous user'。
此方法目前无效,我想知道是否可以在到达视图逻辑之前编辑 request.user。
根据评论中的要求进行编辑,这里是 REST_FRAMEWORK
设置:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated'
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.MultiPartParser',
'rest_framework.parsers.FormParser',
]
}
找到了,是的,有可能。事实证明,正如 mehamasum 在上面的评论中正确指出的那样,我的 DEFAULT_AUTHENTICATION_CLASSES
中的 TokenAuthentication
正在覆盖请求中令牌中的 request.user。这可以通过向中间件函数添加 _force_auth_user
和 force_auth_token
来覆盖,如下所示:
class ControlledUserMiddleware(MiddlewareMixin):
def process_request(self, request):
controlled_user_uuid = request.META.get('HTTP_CONTROLLED_USER', None)
if controlled_user_uuid:
controlled_user = User.objects.get(uuid=controlled_user_uuid)
request._force_auth_user = controlled_user
request._force_auth_token = Token.objects.get(user=controlled_user)
我正在创建一种方法,让超级用户可以控制另一个用户的帐户,但允许登录以显示此时执行的所有操作都是由超级用户完成的。
我目前的想法是在中间件中处理请求并寻找特定的header。如果 header 存在,我将用 header 中指定的用户替换当前的 request.user。目前中间件看起来像这样:
class ControlledUserMiddleware(MiddlewareMixin):
def process_request(self, request):
controlled_user = request.META.get('HTTP_CONTROLLED_USER', None)
if controlled_user:
request.user = User.objects.get(uuid=controlled_user)
我发现 - 尽管我已将它放在我的设置文件中的 auth 中间件之后 - 请求中的用户在到达此功能时始终是 'anonymous user'。
此方法目前无效,我想知道是否可以在到达视图逻辑之前编辑 request.user。
根据评论中的要求进行编辑,这里是 REST_FRAMEWORK
设置:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated'
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.MultiPartParser',
'rest_framework.parsers.FormParser',
]
}
找到了,是的,有可能。事实证明,正如 mehamasum 在上面的评论中正确指出的那样,我的 DEFAULT_AUTHENTICATION_CLASSES
中的 TokenAuthentication
正在覆盖请求中令牌中的 request.user。这可以通过向中间件函数添加 _force_auth_user
和 force_auth_token
来覆盖,如下所示:
class ControlledUserMiddleware(MiddlewareMixin):
def process_request(self, request):
controlled_user_uuid = request.META.get('HTTP_CONTROLLED_USER', None)
if controlled_user_uuid:
controlled_user = User.objects.get(uuid=controlled_user_uuid)
request._force_auth_user = controlled_user
request._force_auth_token = Token.objects.get(user=controlled_user)