給Django Admin添加驗(yàn)證碼和多次登錄嘗試限制的實(shí)現(xiàn)
Django自帶的Admin很好用,但是放到生產(chǎn)環(huán)境總還差了點(diǎn)什么= =
看看admin的介紹:
Django奉行Python的內(nèi)置電池哲學(xué)。它自帶了一系列在Web開發(fā)中用于解決常見問題或需求的額外的、可選工具。這些工具和插件,例如django.contrib.redirects都必須在settings中的INSTALLED_APPS處進(jìn)行注冊(cè),有的還需要執(zhí)行manage.py migrate命令,在數(shù)據(jù)庫中創(chuàng)建一些數(shù)據(jù)表。
Admin站點(diǎn)是Django有別于其它Web框架最重要的一點(diǎn),并且非常受歡迎,簡直是出門旅游xxxx的必備。不管你是寫個(gè)小demo還是做個(gè)大項(xiàng)目都用得上。admin(下文中將Admin管理后臺(tái)簡稱為admin)通過讀取你的模型數(shù)據(jù),快速構(gòu)造出一個(gè)可以對(duì)實(shí)際數(shù)據(jù)進(jìn)行管理的Web站點(diǎn),常用于開發(fā)測試,簡單管理等場合,適用于部門內(nèi)部為工作方便的場合, 但不建議在生產(chǎn)環(huán)境中使用。
為什么不建議在生產(chǎn)環(huán)境使用呢,因?yàn)锳dmin缺了驗(yàn)證碼和登錄限制這種安全方面的功能!等會(huì)被人隨便暴力破解就進(jìn)后臺(tái)了,那我們的系統(tǒng)安全性還怎么保障?
但是別急,我已經(jīng)通過魔改的方式實(shí)現(xiàn)了驗(yàn)證碼和登錄限制了,現(xiàn)在可以愉快使用admin系統(tǒng)了。
先看看效果
效果還是nice的,登錄嘗試次數(shù)可以自己設(shè)定,我這里就不演示了,輸那么多次錯(cuò)誤密碼太麻煩了。
驗(yàn)證碼
驗(yàn)證碼我是用了 django-simple-captcha
這個(gè)庫,配合 multi_captcha_admin
來生成驗(yàn)證碼form,非常方便。
首先是pip安裝這兩個(gè)庫,大家都懂的,不再贅述。
配置一下 settings.py
:
INSTALLED_APPS = [ 'multi_captcha_admin', ] # 驗(yàn)證碼配置 MULTI_CAPTCHA_ADMIN = { 'engine': 'simple-captcha', }
配置 urls.py
:
# 添加這一項(xiàng) path('captcha/', include('captcha.urls')),
到了這步就好啦,如果用的是Django官方的Admin就直接能顯示出登錄的驗(yàn)證碼了,不過我用的是第三方的Admin,所以需要手動(dòng)添加form。
方法很簡單,找到 login.html
,在登錄的表單里面添加這一項(xiàng)就好了。
{{ form.captcha }}
默認(rèn)生成的驗(yàn)證碼和輸入框是原生樣式,比較丑~ 我們可以優(yōu)化一下。我是用js把生成的圖片和驗(yàn)證碼輸入框替換成elementUI的樣式,有需要的小伙伴可以參考一下。
var row = document.querySelector('#captcha_group'); var captcha_img = document.querySelector('img.captcha'); var col_8 = document.createElement('el-col'); col_8.setAttribute(':span', '8'); col_8.appendChild(captcha_img); var captcha_input = document.querySelector('#id_captcha_1'); var el_input = document.createElement('el-input'); var col_16 = document.createElement('el-col'); col_16.setAttribute(':span', '16'); el_input.setAttribute('name', captcha_input.getAttribute('name')); el_input.setAttribute('v-model', 'captcha'); el_input.setAttribute('required', 'required'); el_input.setAttribute('placeholder', '請(qǐng)輸入驗(yàn)證碼'); col_16.appendChild(el_input); captcha_input.parentNode.removeChild(captcha_input); row.appendChild(col_8); row.appendChild(col_16);
登錄限流
這個(gè)也不復(fù)雜,不過我一開始做還是花了比較長時(shí)間,查不到什么有用的資料,后面我去讀了Django Admin的代碼,一下就想出解決方法了哈哈~
通過admin的代碼,我發(fā)現(xiàn)處理登錄是 admin.site.login(request, extra_context)
這個(gè)方法,那問題就變得很簡單了,給他加一個(gè)裝飾器就好了,不過我們不能去修改框架的代碼,所以自己寫一個(gè)新的view,如下:
# 覆蓋默認(rèn)的admin登錄方法實(shí)現(xiàn)登錄限流 @ratelimit(key='ip', rate='5/m', block=True) def extend_admin_login(request, extra_context=None): return admin.site.login(request, extra_context)
然后在 urls.py
里配置一下,記得要放在 admin
的前面:
urlpatterns = [ path('admin/login/', views.extend_admin_login), path('admin/', admin.site.urls), ]
這樣就可以實(shí)現(xiàn)限流了,這里要介紹一下 ratelimit
這個(gè)裝飾器,這是django-ratelimit這個(gè)包提供的,為了使用這個(gè)包,需要配置redis緩存,附上配置代碼:
# 配置redis緩存 CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', # 緩存后端 Redis # 連接Redis數(shù)據(jù)庫(服務(wù)器地址) # 一主帶多從(可以配置個(gè)Redis,寫走第一臺(tái),讀走其他的機(jī)器) 'LOCATION': [ 'redis://localhost:6379/0', ], 'KEY_PREFIX': 'milky', # 項(xiàng)目名當(dāng)做文件前綴 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', # 連接選項(xiàng)(默認(rèn),不改) 'CONNECTION_POOL_KWARGS': { 'max_connections': 512, # 連接池的連接(最大連接) }, } } }
@ratelimit(key='ip', rate='5/m', block=True)
, key=ip
表示根據(jù)ip來區(qū)分, rate=5/m
表示一分鐘最多請(qǐng)求這個(gè)接口5次, block=true
表示超過這個(gè)限制就直接攔截,如果沒有設(shè)置block參數(shù)的話,超過限制也不會(huì)攔截,但是可以在ratelimit計(jì)數(shù)器里面看到請(qǐng)求的次數(shù)。
更多用法可以看官方文檔: https://django-ratelimit.readthedocs.io/en/stable/index.html
參考資料
https://github.com/a-roomana/django-multi-captcha-admin
https://django-simple-captcha.readthedocs.io/en/latest/advanced.html#rendering
到此這篇關(guān)于給Django Admin添加驗(yàn)證碼和多次登錄嘗試限制的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Django Admin驗(yàn)證碼和登錄限制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- django如何實(shí)現(xiàn)用戶的注冊(cè)、登錄、注銷功能
- django authentication 登錄注冊(cè)的實(shí)現(xiàn)示例
- Django 登錄注冊(cè)的實(shí)現(xiàn)示例
- Python基于Django實(shí)現(xiàn)驗(yàn)證碼登錄功能
- 利用django和mysql實(shí)現(xiàn)一個(gè)簡單的web登錄頁面
- Django通過自定義認(rèn)證后端實(shí)現(xiàn)多種登錄方式驗(yàn)證
- Django實(shí)現(xiàn)簡單登錄的示例代碼
- Django實(shí)現(xiàn)前后端登錄
- Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能)
- 使用Tastypie登錄Django的問題解決
相關(guān)文章
使用python 對(duì)驗(yàn)證碼圖片進(jìn)行降噪處理
今天小編就為大家分享一篇使用python 對(duì)驗(yàn)證碼圖片進(jìn)行降噪處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python-OpenCV深度學(xué)習(xí)入門示例詳解
深度學(xué)習(xí)已經(jīng)成為機(jī)器學(xué)習(xí)中最受歡迎和發(fā)展最快的領(lǐng)域。深度學(xué)習(xí)的常見應(yīng)用包括語音識(shí)別、圖像識(shí)別、自然語言處理、推薦系統(tǒng)等等。本文將通過一些示例代碼,帶你詳細(xì)了解深入學(xué)習(xí)2021-12-12window11系統(tǒng)下Python3.11安裝numpy庫超詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于window11系統(tǒng)下Python3.11安裝numpy庫的相關(guān)資料,NumPy是Python的第三方擴(kuò)展包,但它并沒有包含在Python標(biāo)準(zhǔn)庫中,因此您需要單獨(dú)安裝它,需要的朋友可以參考下2023-12-12Python使用pyinstaller打包含有g(shù)ettext?locales語言環(huán)境的項(xiàng)目(推薦)
最近在用 pyhton 做一個(gè)圖片處理的小工具,順便接觸了gettext,用來實(shí)現(xiàn)本地化化中英文轉(zhuǎn)換,本文通過一個(gè)項(xiàng)目給大家詳細(xì)介紹下,感興趣的朋友跟隨小編一起看看吧2022-01-01Python網(wǎng)絡(luò)爬蟲中的同步與異步示例詳解
這篇文章主要給大家介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲中同步與異步的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02