Django自定義用戶(hù)登錄認(rèn)證示例代碼
前言
有時(shí)候 Django 自帶的用戶(hù)登錄認(rèn)證不能滿(mǎn)足我們的需求,比如我不想要用戶(hù)名+密碼登錄,我想手機(jī)號(hào)+驗(yàn)證碼登錄,這樣就需要我們?nèi)バ薷?Django 自帶的認(rèn)證了。
Django 默認(rèn)使用用戶(hù)認(rèn)證的是ModelBackend,這個(gè)類(lèi)也就是我們要下手的地方,ModelBackend里面有一個(gè)authenticate的方法,這個(gè)方法就是登錄時(shí)對(duì)用戶(hù)認(rèn)證的方法。我們要改的就是這個(gè)方法。
先看看原碼理解一下認(rèn)證邏輯:
第15-16行先獲取認(rèn)證用的用戶(hù)名字段,默認(rèn)是username,如果在Usermodel里面重新定義了USERNAME_FIELD,如改為USERNAME_FIELD = 'mobile'
,那么現(xiàn)在就是以手機(jī)號(hào)來(lái)登錄了。
第18-22行就是根據(jù) username 去獲取 user 對(duì)象,如果沒(méi)有這個(gè) user 就做一次密碼 hasher (不太理解這里的作用,不過(guò)不影響修改),然后就退出方法了。
第24-25行就是獲取到用戶(hù)后,驗(yàn)證用戶(hù)傳過(guò)來(lái)的密碼跟數(shù)據(jù)庫(kù)里的是否一致并且該用戶(hù)是否有登錄權(quán)限,驗(yàn)證都通過(guò)后就把 user 返回去,否則退出返回,不返回任何東西。
明白了認(rèn)證的邏輯,就開(kāi)始修改了,首先新建一個(gè)類(lèi),繼承ModelBackend,然后重寫(xiě)authenticate方法,比如上面提到的改為手機(jī)號(hào)+驗(yàn)證碼的方式,只要改成如下:
只是稍微的做了點(diǎn)修改,把第24行里的密碼驗(yàn)證改為了驗(yàn)證碼驗(yàn)證,這里password 字段用于存放驗(yàn)證碼,而不再是用戶(hù)的密碼了。其它的邏輯都沒(méi)變。
這里改了之后,要在Usermodel 里加上check_verify_code這個(gè)方法,否則會(huì)報(bào)錯(cuò),還要修改類(lèi)變量USERNAME_FIELD = 'mobile',不然還是會(huì)以u(píng)sername來(lái)認(rèn)證,具體的實(shí)現(xiàn)邏輯根據(jù)自己的實(shí)際情況來(lái),這里就不展示里面的邏輯。
好,用戶(hù)的認(rèn)證改好了,還有最重要的一步,在settings.py里添加一條這樣的配置:
AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends'] # 里面改成自己寫(xiě)的認(rèn)證類(lèi)。格式必須是 包名.文件名.類(lèi)名
到此就完成了。
總結(jié):(以手機(jī)號(hào)+驗(yàn)證碼為例)
- 新建一個(gè) CustomModelBackend 類(lèi),重寫(xiě) authenticate 方法,根據(jù)自己實(shí)際需求寫(xiě)認(rèn)證邏輯。
- 在Usermodel里添加驗(yàn)證驗(yàn)證碼的方法。
- 在Usermodel里改變類(lèi)變量USERNAME_FIELD為mobile。
- 在在settings.py里添加一條配置:
AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends']
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python+Requests+PyTest+Excel+Allure?接口自動(dòng)化測(cè)試實(shí)戰(zhàn)
本文主要介紹了Python+Requests+PyTest+Excel+Allure?接口自動(dòng)化測(cè)試實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02使用Python獲取字典鍵對(duì)應(yīng)值的兩種方法
對(duì)于字典通過(guò)鍵獲得值非常簡(jiǎn)單,但通過(guò)值獲得鍵則需繞些彎子,下面這篇文章主要給大家介紹了關(guān)于如何使用Python獲取字典鍵對(duì)應(yīng)值的相關(guān)資料,需要的朋友可以參考下2022-04-04詳解Python中range()與xrange()的區(qū)別
range()?和?xrange()?是兩個(gè)函數(shù),可用于在?Python的?for?循環(huán)中迭代一定次數(shù)。本文將通過(guò)示例詳細(xì)說(shuō)說(shuō)二者的區(qū)別與使用,需要的可以參考一下2022-09-09Python如何使用print()函數(shù)輸出格式化字符串
Python中內(nèi)置的%操作符和format函數(shù),都可以用于格式化字符串,下面這篇文章主要給大家介紹了關(guān)于Python如何使用print()函數(shù)輸出格式化字符串的相關(guān)資料,需要的朋友可以參考下2021-08-08Python庫(kù)coala代碼分析和自動(dòng)化檢查改進(jìn)工具使用探索
Python的coala工具是一個(gè)強(qiáng)大的代碼分析和自動(dòng)化改進(jìn)工具,它可以幫助開(kāi)發(fā)人員自動(dòng)化地檢查代碼并提供改進(jìn)建議,本文將詳細(xì)介紹coala的功能和用法,并提供豐富的示例代碼來(lái)幫助大家深入了解它2024-01-01在python中創(chuàng)建表格的兩種方法實(shí)例
Python 是一種解釋型、面向?qū)ο?、?dòng)態(tài)數(shù)據(jù)類(lèi)型的高級(jí)程序設(shè)計(jì)語(yǔ)言,下面這篇文章主要給大家介紹了關(guān)于如何在python中創(chuàng)建表格的兩種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01python實(shí)現(xiàn)多線程抓取知乎用戶(hù)
本文給大家分享的是如何使用Python實(shí)現(xiàn)多線程抓取知乎用戶(hù)的思路以及代碼,非常的詳細(xì),作者使用本程序成功抓取到了百萬(wàn)用戶(hù),有需要的小伙伴可以參考下2016-12-12