簡體   English   中英

如何在管理面板中第一次登錄django員工用戶?

[英]How to check django staff user first time login in admin panel?

我正在研究django項目,我正在使用默認的auth應用程序進行身份驗證。
我知道用戶模型中有一個last_login字段,用於存儲用戶的上次登錄時間。

當員工用戶第一次登錄管理面板時,我想檢查last_login字段是否為none,並將他重定向到更改密碼頁面。

我應該把這張支票放在哪里?


到目前為止我嘗試過的:

我試圖使用自定義登錄表單並覆蓋默認的confirm_login_allowed方法,但似乎我只能引發驗證錯誤以阻止使用這些登錄嘗試。

我也嘗試使用django.contrib.auth.signals.user_logged_in信號,但是當last_loginNone時,我也不允許我返回重定向響應。

我想知道在用戶通過身份驗證后如何返回重定向響應。

使用AdminSite自定義Django管理員並使用login_form屬性為管理員登錄頁面提供自定義登錄表單。

admin.py

class MyAdminSite(AdminSite):
    login_form = CustomAdminLoginForm

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

urls.py

當重寫Admin時,我們必須擺脫Django默認管理員

from app.admin import admin_site

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

forms.py

AuthenticationForm具有confirm_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 AdminSite類(您通常由admin.site訪問的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中實際發生的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM