1. 程式人生 > >django實現登錄時候輸入密碼錯誤5次鎖定用戶十分鐘

django實現登錄時候輸入密碼錯誤5次鎖定用戶十分鐘

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次鎖定用戶十分鐘