我有一个Django应用。当以管理员用户身份登录时,我希望能够在URL中传递一个秘密参数,并使整个网站的行为就像我是另一个用户一样。
假设我有/my-profile/显示当前登录用户个人资料的URL 。我希望能够做类似的事情/my- profile/?__user_id=123,并使基础视图相信我实际上是ID 123的用户(因此呈现 该 用户的个人资料)。
/my-profile/
/my- profile/?__user_id=123
我为什么要那样?
仅仅因为重现仅出现在单个用户帐户中的某些错误要容易得多。
我的问题:
实现这样的最简单的方法是什么?
在执行此操作时,我应该考虑任何安全问题吗?请注意,我(显然)只想为管理员用户提供此功能,并且我们的管理员用户无论如何都具有对源代码,数据库等的完全访问权限,因此它并不是真正的“后门”。它只是使访问用户帐户 变得更加容易 。
我用一个简单的中间件解决了这个问题。它还处理重定向(即,在重定向过程中保留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