如何在 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
背景
我们有一项服务,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