【问题标题】:How to give a user a single session extra permission in Django如何在 Django 中为用户提供单个会话额外权限
【发布时间】:2025-11-28 07:20:03
【问题描述】:

背景

我们有一项服务,django 超级管理员可以登录并查看特定组织中的所有用户,并且该超级管理员可以代替该用户“登录”。即假设我们有

super admin = joe
users = mike, abe, tony

然后joe 可以登录到一个组织,看到mike、abe 和tony,然后joe 可以像mike 一样登录到系统。他们看到和做的每一件事都好像迈克正在做一样。因此,如果超级管理员有权创建公共事件,但迈克没有,那么当超级管理员以迈克身份登录时,他们也将无法创建事件。

到目前为止一切顺利。

但是我们意识到,在许多情况下,我们希望超级管理员以 mike 身份登录,并且仍然被系统识别为超级管理员。这对于数据迁移很有用,即有时超级管理员实际上应该以 mike 的名义做 mike 不能自己做的事情。

问题

这里的想法是我希望系统能够识别超级管理员以 mike 身份登录。然而,我在网上看到的所有问题(例如this one)更多的是关于分配永久权限(即通过将它们存储在数据库中),而不是临时/临时权限。

这是当管理员点击 mike 旁边的登录按钮时调用的代码:

class LoginAsView(APIView):
    permission_classes = []

    def get(self, request, *args, **kwargs):
        if request.user.is_superuser and 'username' in request.GET:
            user = User.objects.get(email=request.GET['username'])
            user.backend = settings.AUTHENTICATION_BACKENDS[0]
            login(self.request, user)
            return Response('/', 302, headers={'Location': '/'})
        raise PermissionDenied('NO U')

所以您可以看到我正在检索的用户的行为与该用户(即迈克)有机登录的行为完全相同。我想在这种方法中为 mike 分配一些临时的特殊权限,允许 mike 做他通常不能做的事情。

【问题讨论】:

  • 我得到了这个建议.. 但它本身似乎是一个死胡同:“你可以在会话中存储一个标志,并修改 User.has_permission 等以查看会话..但这很棘手,因为这些函数无权访问请求。”

标签: python django django-models django-admin django-authentication


【解决方案1】:

输入https://github.com/arteria/django-hijack

例如 django-hijack 向会话添加额外标志以检查用户是否被劫持https://github.com/arteria/django-hijack/search?utf8=%E2%9C%93&q=is_hijacked_user

【讨论】: