小编典典

管理员对Django用户的模拟

python

我有一个Django应用。当以管理员用户身份登录时,我希望能够在URL中传递一个秘密参数,并使整个网站的行为就像我是另一个用户一样。

假设我有/my-profile/显示当前登录用户个人资料的URL 。我希望能够做类似的事情/my- profile/?__user_id=123,并使基础视图相信我实际上是ID 123的用户(因此呈现 用户的个人资料)。

我为什么要那样?

仅仅因为重现仅出现在单个用户帐户中的某些错误要容易得多。

我的问题:

  1. 实现这样的最简单的方法是什么?

  2. 在执行此操作时,我应该考虑任何安全问题吗?请注意,我(显然)只想为管理员用户提供此功能,并且我们的管理员用户无论如何都具有对源代码,数据库等的完全访问权限,因此它并不是真正的“后门”。它只是使访问用户帐户 变得更加容易


阅读 212

收藏
2021-01-20

共1个答案

小编典典

我用一个简单的中间件解决了这个问题。它还处理重定向(即,在重定向过程中保留GET参数)。这里是:

class ImpersonateMiddleware(object):
    def process_request(self, request):
        if request.user.is_superuser and "__impersonate" in request.GET:
            request.user = models.User.objects.get(id=int(request.GET["__impersonate"]))

    def process_response(self, request, response):
        if request.user.is_superuser and "__impersonate" in request.GET:
            if isinstance(response, http.HttpResponseRedirect):
                location = response["Location"]
                if "?" in location:
                    location += "&"
                else:
                    location += "?"
                location += "__impersonate=%s" % request.GET["__impersonate"]
                response["Location"] = location
        return response
2021-01-20