【问题标题】:Is there any way to edit the request user in django middleware?有没有办法在 django 中间件中编辑请求用户?
【发布时间】:2019-07-26 00:04:55
【问题描述】:

我正在为超级用户创建一种方式来控制另一个用户的帐户,但允许记录显示在此期间执行的所有操作都是由超级用户完成的。

我目前的想法是在中间件中处理请求并寻找特定的标头。如果该标头存在,我会将当前 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 到达视图逻辑之前对其进行编辑。

根据 cmets 的要求进行编辑,这里是 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',
    ]
}

【问题讨论】:

  • 我觉得这个主意不好。因为无法区分普通用户和超级用户的日志会很头疼。
  • 所以,我的建议是,向超级用户提供此类操作的访问/权限。
  • 我在日志中添加了一个额外的列,因此所有日志看起来都正常,除了那些包含添加的“受控用户”的日志,这将显示用户在执行请求时的行为.尽管如此——纯粹为了科学——是否可以覆盖 request.user?
  • 我还没试过。你的状态呢?你的 sn-p 工作正常吗?\
  • 请分享您的REST_FRAMEWORK 设置。 DRF 的DEFAULT_AUTHENTICATION_CLASSES(如果您已定义)应该提供一些提示。

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


【解决方案1】:

找到了,是的,有可能。事实证明,正如 mehamasum 在上面的评论中正确指出的那样,我的 DEFAULT_AUTHENTICATION_CLASSES 中的 TokenAuthentication 正在从请求中的令牌覆盖 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)

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 2023-01-20
    • 2021-08-03
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多