前言
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了靜安免費(fèi)建站歡迎大家使用!有時(shí)候 Django 自帶的用戶登錄認(rèn)證不能滿足我們的需求,比如我不想要用戶名+密碼登錄,我想手機(jī)號(hào)+驗(yàn)證碼登錄,這樣就需要我們?nèi)バ薷?Django 自帶的認(rèn)證了。
Django 默認(rèn)使用用戶認(rèn)證的是ModelBackend,這個(gè)類也就是我們要下手的地方,ModelBackend里面有一個(gè)authenticate的方法,這個(gè)方法就是登錄時(shí)對(duì)用戶認(rèn)證的方法。我們要改的就是這個(gè)方法。
先看看原碼理解一下認(rèn)證邏輯:
第15-16行先獲取認(rèn)證用的用戶名字段,默認(rèn)是username,如果在Usermodel里面重新定義了USERNAME_FIELD,如改為USERNAME_FIELD = 'mobile'
,那么現(xiàn)在就是以手機(jī)號(hào)來登錄了。
第18-22行就是根據(jù) username 去獲取 user 對(duì)象,如果沒有這個(gè) user 就做一次密碼 hasher (不太理解這里的作用,不過不影響修改),然后就退出方法了。
第24-25行就是獲取到用戶后,驗(yàn)證用戶傳過來的密碼跟數(shù)據(jù)庫里的是否一致并且該用戶是否有登錄權(quán)限,驗(yàn)證都通過后就把 user 返回去,否則退出返回,不返回任何東西。
明白了認(rèn)證的邏輯,就開始修改了,首先新建一個(gè)類,繼承ModelBackend,然后重寫authenticate方法,比如上面提到的改為手機(jī)號(hào)+驗(yàn)證碼的方式,只要改成如下:
只是稍微的做了點(diǎn)修改,把第24行里的密碼驗(yàn)證改為了驗(yàn)證碼驗(yàn)證,這里password 字段用于存放驗(yàn)證碼,而不再是用戶的密碼了。其它的邏輯都沒變。
這里改了之后,要在Usermodel 里加上check_verify_code這個(gè)方法,否則會(huì)報(bào)錯(cuò),還要修改類變量USERNAME_FIELD = 'mobile',不然還是會(huì)以u(píng)sername來認(rèn)證,具體的實(shí)現(xiàn)邏輯根據(jù)自己的實(shí)際情況來,這里就不展示里面的邏輯。
好,用戶的認(rèn)證改好了,還有最重要的一步,在settings.py里添加一條這樣的配置:
AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends'] # 里面改成自己寫的認(rèn)證類。格式必須是 包名.文件名.類名
到此就完成了。
總結(jié):(以手機(jī)號(hào)+驗(yàn)證碼為例)
AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends']
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。