django實現登錄時候輸入密碼錯誤5次鎖定用戶十分鐘
阿新 • • 發佈:2018-01-18
redirect 記錄鎖 res contain objects title 開始 dir 解密
django實現登錄時候輸入密碼錯誤5次鎖定用戶十分鐘
在學習django的時候,想要實現登錄失敗後,進行用戶鎖定,切記錄鎖定時間,在網上找了很多資料,但是都感覺不是那麽靠譜,於是乎,我開始了我的設計,其實我一開始想要借助redis呢,但是想要先開發一個簡單的,後續在拆分後,然後在去進行拆分, 這樣也是很接近我們在真實的開發中所遇到問題。
我的思路是:
輸入賬號密碼》是否已經登錄》提示已經登錄
輸入賬號密碼》錯誤次數少於6次》校驗密碼》登錄成功,記錄登錄時間,錯誤次數清空,記錄登錄狀態
輸入賬號密碼》錯誤大於六次》提示鎖定,並且記錄錯誤次數
輸入賬號密碼》是否凍結》提示凍結
這樣我們就來設計我們的數據庫:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class User(AbstractUser):
avatar = models.ImageField(upload_to = ‘vaatar/%Y/%m‘ ,default = ‘vaatar/default/pang‘ )
qq = models.CharField(u ‘qq號碼‘ , max_length = 20 ,blank = True )
mobile = models.CharField(u ‘手機號‘ ,max_length = 11 ,blank = True ,null = True ,unique = True )
login_sta = models.CharField(u ‘登錄是否鎖定‘ , max_length = 2 , default = 0 )
login_suo = models.DateTimeField(u ‘登錄鎖定時間‘ )
pass_errnum = models.IntegerField(u ‘用戶密碼輸入次數‘ ,default = 0 )
is_login = models.BooleanField(default = False )
class Meta:
verbose_name = u ‘用戶‘
verbose_name_plural = verbose_name ordering = [ ‘-id‘ ]
def __str__( self ) :
return self .username
|
這裏的用戶集成了django默認的用戶來進行設計的,
那麽我們同步我們的數據庫。
同步後我們來看看我們的數據庫,
整體結構出來了,我們來設計我們的登錄用戶的視圖,這裏還是采用面向對象的方式來設計我們的登錄視圖,
具體的實現如下:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
from django.contrib.auth.hashers import make_password, check_password
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import render, redirect
from django.views.generic.base import View
class LoginView(View):
def get( self ,request):
return render(request, ‘login.html‘ )
def post( self ,request):
next = request.META.get( ‘HTTP_REFERER‘ )
username = request.POST.get( ‘username‘ , None )
password = request.POST.get( ‘password‘ , None )
try :
user = User.objects.get(username = username)
if user.is_login = = True :
return render(request, ‘login.html‘ , { ‘msg‘ : ‘同時只能登陸一臺設備!‘ })
if user.login_sta = = True :
return render(request, ‘login.html‘ , { ‘msg‘ : ‘賬號已經凍結!‘ })
if (datetime.datetime.now() - user.login_suo).total_seconds() < 600 :
return render(request, ‘login.html‘ , { ‘msg‘ : ‘賬號鎖定十分鐘內不能登陸!‘ })
if user.pass_errnum> 5 :
user.login_suo = datetime.datetime.now()
return render(request, ‘login.html‘ , { ‘msg‘ : ‘密碼輸入超過5次,用戶鎖定十分鐘‘ })
if check_password(password,user.password) :
request.session[ ‘username‘ ] = username
if ‘/logout‘ or ‘/reg‘ in next :
response = HttpResponseRedirect( ‘/‘ )
else :
response = HttpResponseRedirect( next )
user.last_login = datetime.datetime.now()
user.is_login = True
user.pass_errnum = 0
user.save()
response.set_cookie( ‘username‘ , username, 3600 )
return response
user.pass_errnum + = 1
user.save()
return render(request, ‘login.html‘ , { ‘msg‘ : ‘密碼錯誤‘ })
except :
return render(request, ‘login.html‘ ,{ ‘msg‘ : ‘用戶名不存在!‘ })
|
整體的思路以及實現,我們來實驗下,這裏的補充下,之前的我們的註冊的密碼,是按照原來的直接儲存密碼的,這樣來說是不安全的,我們來使用django自帶的進行密碼加密解密。
我們來體驗下我們的程序!
用戶已經登錄了,我們在另一臺設備來退出我們的賬號就可以
這樣我們輸入6次,就鎖定了這個賬號,同時也給我們記錄了鎖定時間。
其實這裏我們推出的模塊的設計如下:
?1 2 3 4 5 6 7 8 9 10 11 |
class LogoutView(View):
def get( self ,request):
try :
user = User.objects.get(username__exact = request.session[ ‘username‘ ])
user.last_login = datetime.datetime.now()
user.is_login = False
user.save()
del request.session[ ‘username‘ ]
return render(request, ‘index.html‘ )
except :
return HttpResponseRedirect( ‘/‘ )
|
django實現登錄時候輸入密碼錯誤5次鎖定用戶十分鐘