【发布时间】: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