一个用于在Django用户管理页面上添加“登录为用户”按钮的应用。
项目描述
django-loginas
关于
Django admin的“登录为用户”。
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 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 37aec6fcd1cdb72378b69d2468d2ae39b12cd013f838a9bf9b9b5132e8341735 |
|
MD5 | 46e24d2d0bcc32eeb4bd69501294aaf5 |
|
BLAKE2b-256 | 116418c4aabda35fd2eac92385ce6802384eece22684054a07e1fcc908544dcb |