有什么办法可以在django中间件中编辑请求用户?

时间:2019-03-04 16:17:50

标签: django python-3.x django-rest-framework django-middleware

我正在为超级用户创建一种控制另一用户帐户的方法,但是允许登录以显示这次执行的所有操作都是由超级用户完成的。

我目前的想法是在中间件中处理请求并查找特定的标头。如果该标头存在,我将用标头中指定的用户替换当前的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中间件之后-请求中的用户在达到此功能时始终是“匿名用户”。

该方法当前不起作用,我想知道是否有可能在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',
    ]
}

1 个答案:

答案 0 :(得分:0)

找到了,是可能的。事实证明,正如上述评论正确指出的那样,我的TokenAuthentication中的DEFAULT_AUTHENTICATION_CLASSES从请求中的令牌覆盖了request.user。可以通过向中间件函数中添加_force_auth_userforce_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)