如何在Django中为用户提供单个会话额外权限

时间:2016-08-23 09:17:03

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

背景

我们有一个服务,django超级管理员可以登录并查看特定组织中的所有用户,这个超级管理员可以在该用户的位置“登录”。也就是说我们有

super admin = joe
users = mike, abe, tony
然后乔可以登录组织,看到迈克,阿贝和托尼,然后乔可以登录系统,好像他们是迈克一样。他们所看到和做的一切都将像迈克一样。因此,如果超级管理员有权创建公共事件,但迈克没有,当超级管理员以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做他通常做不到的事情。

1 个答案:

答案 0 :(得分:1)

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

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