有時候 Django 自帶的用戶登陸認證不能知足咱們的需求,好比我不想要用戶名+密碼登陸,我想手機號+驗證碼登陸,這樣就須要咱們去修改 Django 自帶的認證了。數據庫
Django 默認使用用戶認證的是ModelBackend
,這個類也就是咱們要下手的地方,ModelBackend
裏面有一個authenticate
的方法,這個方法就是登陸時對用戶認證的方法。咱們要改的就是這個方法。code
先看看原碼理解一下認證邏輯:cdn
第15-16行先獲取認證用的用戶名字段,默認是username
,若是在User
model裏面從新定義了USERNAME_FIELD
,如改成USERNAME_FIELD = 'mobile'
,那麼如今就是以手機號來登陸了。對象
第18-22行就是根據 username 去獲取 user 對象,若是沒有這個 user 就作一次密碼 hasher (不太理解這裏的做用,不過不影響修改),而後就退出方法了。blog
第24-25行就是獲取到用戶後,驗證用戶傳過來的密碼跟數據庫裏的是否一致而且該用戶是否有登陸權限,驗證都經過後就把 user 返回去,不然退出返回,不返回任何東西。繼承
明白了認證的邏輯,就開始修改了,首先新建一個類,繼承ModelBackend
,而後重寫authenticate
方法,好比上面提到的改成手機號+驗證碼的方式,只要改爲以下:hash
只是稍微的作了點修改,把第24行裏的密碼驗證改成了驗證碼驗證,這裏password 字段用於存放驗證碼,而再也不是用戶的密碼了。其它的邏輯都沒變。it
這裏改了以後,要在User
model 里加上check_verify_code
這個方法,不然會報錯,還要修改類變量USERNAME_FIELD = 'mobile'
,否則仍是會以username
來認證,具體的實現邏輯根據本身的實際狀況來,這裏就不展現裏面的邏輯。io
好,用戶的認證改好了,還有最重要的一步,在settings.py
裏添加一條這樣的配置:驗證碼
AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends'] # 裏面改爲本身寫的認證類。格式必須是 包名.文件名.類名
到此就完成了。
CustomModelBackend
類,重寫 authenticate
方法,根據本身實際需求寫認證邏輯。User
model裏添加驗證驗證碼的方法。User
model裏改變類變量USERNAME_FIELD
爲mobile
。settings.py
裏添加一條配置:AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends']