如何在管理面板中第一次登录django员工用户?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在管理面板中第一次登录django员工用户?相关的知识,希望对你有一定的参考价值。

我正在研究django项目,我正在使用默认的auth应用程序进行身份验证。 我知道用户模型中有一个last_login字段,用于存储用户的上次登录时间。

当员工用户第一次登录管理面板时,我想检查last_login字段是否为none并将其重定向到更改密码页面。

我应该把这张支票放在哪里?


What I have tried so far:

我试图使用自定义登录表单并覆盖默认的confirm_login_allowed方法,但似乎我只能提出验证错误来阻止使用这些登录尝试。

我也尝试使用django.contrib.auth.signals.user_logged_in信号,但是当last_loginNone时,我也不允许我返回重定向响应。

我想知道在用户通过身份验证后如何返回重定向响应。

答案

Django管理员不是那么可配置的。你应该挂钩它的内部视图。登录/注销视图位于Django AdminSite类(您通常由admin.site访问的类)中。我的实现有点hacky但很小:

粘贴在urls.py的顶部

from django.contrib import admin
from django.contrib.admin import AdminSite
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

class MyAdminSite(AdminSite):
    def login(self, request, extra_context=None):
        new_user = False
        user = None

        username = request.POST.get('username')  # Hack to find user before its last_login set to now.
        if username:
            user = User.objects.filter(username=username).first()
            if user:
                new_user = user.last_login is None

        r = super(MyAdminSite, self).login(request, extra_context)

        if new_user and request.user == user and isinstance(r, HttpResponseRedirect):  # Successful logins will result in a redirect.
            return HttpResponseRedirect(reverse('admin:password_change'))
        return r

admin.site = MyAdminSite()

如果你想要一个更干净的解决方案,我建议在用户模型中使用布尔值,而不是依靠last_login,这样你就可以检查request.user而不是我的hack进入request.POST

你可以阅读AdminSite.logindjango.contrib.auth.views.login,看看Django里面究竟发生了什么。

另一答案

使用AdminSite自定义Django管理员并使用login_form属性为管理员登录页面提供自定义登录表单。

admin.朋友

class MyAdminSite(AdminSite):
    login_form = CustomAdminLoginForm

admin_site = MyAdminSite(name='myadmin')
admin_site.register(User)
admin_site.register(Group

URLs.朋友

当重写Admin时,我们必须摆脱Django默认管理员

from app.admin import admin_site

url(r'^admin/', admin_site.urls)

forms.朋友

AuthenticationFormconfirm_login_allowed方法使用此方法授予登录或不登录的权限。

class CustomAdminLoginForm(AuthenticationForm):
    def confirm_login_allowed(self, user):
        if user.last_login:
            raise ValidationError(mark_safe('Hey first time user please reset your password here... <a href="/test">test</a>'), code='inactive')

注意:这种方法需要考虑很多边缘情况。

  1. 如果用户没有在第一次设置密码以及您将如何处理第二次尝试怎么办?这次last_long不是没有。虽然date_joined来救援。 last_login == date_joined
  2. 但是如果用户没有在第一天和第二天设置密码怎么办?

编辑:

您可以使用信号检查登录用户并在此处应用config_login_allowed逻辑...?

from django.contrib.auth.signals import user_logged_in


def change_password_first_time(sender, user, request, **kwargs):
    # Your business logic here...

user_logged_in.connect(change_password_first_time)

以上是关于如何在管理面板中第一次登录django员工用户?的主要内容,如果未能解决你的问题,请参考以下文章

Django第二课 基于Django超市订单管理系统开发

Django第二课 基于Django超市订单管理系统开发

我可以用 Amazon Cognito 替换 django 管理面板登录代码吗?

React,Django:用户更改密码后如何管理会话?

成功创建超级用户后无法登录 Heroku 管理面板

Django Admin——批量员工用户创建/从 CSV 文件导入