管理员对Django用户的模拟

发布于 2021-01-29 15:08:10

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

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

我为什么要那样?

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

我的问题:

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

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

关注者
0
被浏览
78
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我用一个简单的中间件解决了这个问题。它还处理重定向(即,在重定向过程中保留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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看