跳转到主要内容

一个用于在Django用户管理页面上添加“登录为用户”按钮的应用。

项目描述

django-loginas

关于

Django admin的“登录为用户”。

PyPI version

loginas仅支持Python 3,从版本0.4开始。如果你使用的是2,请使用0.3.6

安装django-loginas

  • loginas添加到Python路径,或使用pip安装:pip install django-loginas

  • loginas应用添加到INSTALLED_APPS

# settings.py
INSTALLED_APPS = [... 'loginas', ...]
  • loginas URL添加到urls.py
# urls.py
urlpatterns = [
    # from Django 3.2 on, make sure to add loginas urls before the admin site urls, i.e.:
    path('admin/', include('loginas.urls')),
    path('admin/', admin.site.urls),
]
  • 如果你使用的是自定义用户模型,你需要将其添加到模板中,以便按钮显示出来
# admin.py
class YourUserAdmin(ModelAdmin):
    change_form_template = 'loginas/change_form.html'

到此为止,你应该可以开始了。只需访问Django admin,导航到用户,你应该会在屏幕右上角看到“登录为用户”按钮。

配置

在这个阶段,唯一能够以其他用户身份登录的用户是具有 is_superuser 权限的用户。如果你使用自定义用户模型,并且没有指定该权限,或者如果你想更改哪些用户有权限登录为他人,你可以定义 CAN_LOGIN_AS 设置,如下所示

# settings.py

# This will only allow admins to log in as other users:
CAN_LOGIN_AS = lambda request, target_user: request.user.is_superuser

# This will only allow admins to log in as other users, as long as
# those users are not admins themselves:
CAN_LOGIN_AS = lambda request, target_user: request.user.is_superuser and not target_user.is_superuser

# You can also define a string path to a module:
CAN_LOGIN_AS = "utils.helpers.custom_loginas"

默认情况下,点击“以用户登录”会将用户发送到 settings.LOGIN_REDIRECT_URL。你可以像这样覆盖此行为

# settings.py

LOGINAS_REDIRECT_URL = '/loginas-redirect-url'

为了在登出时自动恢复原始用户,替换默认的登出操作,使用特殊的登出操作从签名会话中恢复原始登录会话。

# settings.py

from django.core.urlresolvers import reverse_lazy
LOGOUT_URL = reverse_lazy('loginas-logout')

此外,你可以指定登出时的重定向URL(默认为 settings.LOGIN_REDIRECT_URL)。

# settings.py

from django.core.urlresolvers import reverse_lazy
LOGINAS_LOGOUT_REDIRECT_URL = reverse_lazy('admin:index')

默认情况下,点击“以用户登录”不会更新 user.last_login。你可以像这样覆盖此行为

# settings.py

LOGINAS_UPDATE_LAST_LOGIN = True

默认情况下,登录切换消息将使用 User 模型的 USERNAME_FIELD 生成 Django admin LogEntry 消息,例如 f"User {impersonator_user.getattr(USERNAME_FIELD)} logged in as {impersonated_user.getattr(USERNAME_FIELD)}." 你可以通过传递不同的字段名来覆盖此行为

# settings.py

LOGINAS_USERNAME_FIELD = 'email'

其他实现建议

现有的登出视图?

如果你已经有了登出视图,你可以在“登录为”会话之后修改它,再次登录原始用户。以下是一个示例

class LogoutView(LogoutView):
    template_name = 'myapp/logged_out.html'

    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        from loginas.utils import restore_original_login
        restore_original_login(request)
        return redirect('myapp:login')

模板感知

如果你想在所有模板上下文中访问变量 is_impersonated_session,可以在 settings.py 文件中添加上下文处理器 loginas.context_processors.impersonated_session_status

# settings.py

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                ...
                'loginas.context_processors.impersonated_session_status',
            ],
        },
    },
]

请注意,django-loginas 不会让你登录为其他超级用户,以防止从普通用户升级为超级用户。如果你要登录为超级用户,首先将其降级为非超级用户,然后登录。

许可证

本软件在 BSD 许可证下分发。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

django-loginas-0.3.11.tar.gz (18.7 kB 查看散列)

上传时间 源代码

构建分发

django_loginas-0.3.11-py2.py3-none-any.whl (19.6 kB 查看散列)

上传时间 Python 2 Python 3

支持者