如何在 Django 中给用户一个会话额外的权限

How to give a user a single session extra permission in Django

背景

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

super admin = joe
users = mike, abe, tony

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

到目前为止一切顺利。

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

问题

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

这是管理员单击 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 分配一些临时的特殊权限,允许 mike 做他通常不能做的事情。

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

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