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


         在學習django的時候,想要實現登錄失敗后,進行用戶鎖定,切記錄鎖定時間,在網上找了很多資料,但是都感覺不是那么靠譜,

     於是乎,我開始了我的設計,其實我一開始想要借助redis呢,但是想要先開發一個簡單的,后續在拆分后,然后在去進行拆分, 這樣也是很接近我們在真實的開發中所遇到問題。

      我的思路是:

    輸入賬號密碼》是否已經登錄》提示已經登錄

    輸入賬號密碼》錯誤次數少於6次》校驗密碼》登錄成功,記錄登錄時間,錯誤次數清空,記錄登錄狀態

    輸入賬號密碼》錯誤大於六次》提示鎖定,並且記錄錯誤次數

    輸入賬號密碼》是否凍結》提示凍結

    這樣我們就來設計我們的數據庫:

   

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默認的用戶來進行設計的,

  那么我們同步我們的數據庫。

  同步后我們來看看我們的數據庫,

 

  整體結構出來了,我們來設計我們的登錄用戶的視圖,這里還是采用面向對象的方式來設計我們的登錄視圖

   

     具體的實現如下:

    

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次,就鎖定了這個賬號,同時也給我們記錄了鎖定時間。

 

 

 其實這里我們推出的模塊的設計如下:

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限制用戶登錄的時候密碼輸入次數就得到了解決。個人感覺十分方便。

 

      這樣做可能后期用戶量大,會增加數據庫的壓力,后續可以吧這一塊優化到我們的redis服務器中去。

 

 

      學習就是這么簡單。你要有思路,不會要善於搜索。

     

    千里之行始於足下,萬里學習路始於搜索。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM