[英]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_login
為None
時,我也不允許我返回重定向響應。
我想知道在用戶通過身份驗證后如何返回重定向響應。
使用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')
注意:這種方法需要考慮很多邊緣情況。
date_joined
來救援。 last_login == date_joined
編輯:
您可以使用信號檢查登錄用戶並在此處應用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.login
和django.contrib.auth.views.login
以查看Django中實際發生的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.