我们有一个服务,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做他通常做不到的事情。
答案 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