django 從零開始 9 自定義密碼驗證加密


先上想法,想對數據庫賬號的密碼進行一個加密,但是django文檔中的加密方法set_password貌似是只針對他們默認的user模型 或者繼承 AbstractBaseUser的模型有效

from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import User

其中set_password 就是對make_password進行一層封裝  直接在用戶注冊保存時 user.set_password = password 進行加密

驗證密碼也是對其封裝 check_passwrod封裝                   ................

 

如果自定義按照我下面的方法,但是沒有request.user了

 

 


 

 

於是想在自己定義的模型中使用,查了查文檔發現 那不就和 flask的werkzegu 中的兩個加密方式一樣

只是有一些小坑需要注意

 

 
         
from django.contrib.auth.hashers import make_password,check_password


class
User(models.Model): class Meta: db_table = 'user' name = models.CharField(max_length=20,null=True,unique=True) password = models.CharField(max_length=128) create_date = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name def _set_password(self,password): self.password = make_password(password) def _check_password(self,password): return check_password(password,self.password)

簡單的用戶模型 其中_set_password 是我對需要進行保存的數據 進行一個密碼加密 默認不做任何改動

_check_password 是對查詢到的用戶 進行一個驗證,不過這就是這個坑點了,

 

在flask中驗證密碼是

def _check_password(self,password):
    return check_password(self.password,passowrd) 

先對查詢到用戶使用這個方法_check_password ,直接填入用戶輸入的明文密碼對其驗證就可以了

 

但是django 的參數位置和flask的相反,是先明文,在加密,容易以為是密碼錯誤

# 源碼
def check_password(password, encoded, setter=None, preferred='default'):

先明文密碼,后加密密碼 但我這個是類方法,其實和flask一樣直接填寫就好了,直接設置好了,不需要管參數位置

提醒在視圖函數中使用這個加密方式 會出現這種問題    切記切記

 

 1 def login(request):
 2     if request.POST.method == 'POST':
 3         name = request.POST.get('name')
 4         password = request.POST.get('password')
 5         user = User.objects.filter(name=name).first()
 6         if user:
 7             if user._check_password(password)
 8                 # 舍棄掉 from django.contrib.auth import authenticate
 9                 # 換成自定義登錄 authenticate畢竟只是對數據庫查詢該用戶是否存在,但是如果加密,那么password字段查詢還需要加密.. 算了
10                 # 但是還用用 login對其用戶session添加字段
11                 login(request,user)
12                 return redirect(revsrse('user:inde'))
13             else:
14                 return render(request,'login.html',{"msg":"賬號密碼不匹配"})
15          else:
16              return render(request,'login.html',{"msg":"賬號密碼不匹配"})
17 
18 
19     return  return render(request,'login.html')

 

 

 

 

引用 https://blog.csdn.net/qq_27437781/article/details/86002317


免責聲明!

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



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