Есть ли способ отредактировать запрос пользователя в промежуточном программном обеспечении django? - PullRequest
0 голосов
/ 04 марта 2019

Я создаю способ для суперпользователей взять на себя управление учетной записью другого пользователя, но разрешить ведение журнала, чтобы показать, что все действия, выполненные в это время, выполняются суперпользователем.

Идея, которую я имею в настоящее время, заключается в обработкезапрос в промежуточном программном обеспечении и искать конкретный заголовок.Если этот заголовок существует, я заменю текущий 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 голосов
/ 05 марта 2019

Нашел, да, это возможно.Оказывается, как правильно указывал mehamasum в комментарии выше, TokenAuthentication в моем DEFAULT_AUTHENTICATION_CLASSES перезаписывал 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...