给Django Admin添加验证码和多次登录尝试限制的实现


Posted in Python onJuly 26, 2020

Django自带的Admin很好用,但是放到生产环境总还差了点什么= =

看看admin的介绍:

Django奉行Python的内置电池哲学。它自带了一系列在Web开发中用于解决常见问题或需求的额外的、可选工具。这些工具和插件,例如django.contrib.redirects都必须在settings中的INSTALLED_APPS处进行注册,有的还需要执行manage.py migrate命令,在数据库中创建一些数据表。

Admin站点是Django有别于其它Web框架最重要的一点,并且非常受欢迎,简直是出门旅游xxxx的必备。不管你是写个小demo还是做个大项目都用得上。admin(下文中将Admin管理后台简称为admin)通过读取你的模型数据,快速构造出一个可以对实际数据进行管理的Web站点,常用于开发测试,简单管理等场合,适用于部门内部为工作方便的场合, 但不建议在生产环境中使用。

为什么不建议在生产环境使用呢,因为Admin缺了验证码和登录限制这种安全方面的功能!等会被人随便暴力破解就进后台了,那我们的系统安全性还怎么保障?

但是别急,我已经通过魔改的方式实现了验证码和登录限制了,现在可以愉快使用admin系统了。

先看看效果

给Django Admin添加验证码和多次登录尝试限制的实现

效果还是nice的,登录尝试次数可以自己设定,我这里就不演示了,输那么多次错误密码太麻烦了。

验证码

验证码我是用了 django-simple-captcha 这个库,配合 multi_captcha_admin 来生成验证码form,非常方便。

首先是pip安装这两个库,大家都懂的,不再赘述。

配置一下 settings.py

INSTALLED_APPS = [
  'multi_captcha_admin',
]
 
# 验证码配置
MULTI_CAPTCHA_ADMIN = {
  'engine': 'simple-captcha',
}

配置 urls.py

# 添加这一项
path('captcha/', include('captcha.urls')),

到了这步就好啦,如果用的是Django官方的Admin就直接能显示出登录的验证码了,不过我用的是第三方的Admin,所以需要手动添加form。

方法很简单,找到 login.html ,在登录的表单里面添加这一项就好了。

{{ form.captcha }}

默认生成的验证码和输入框是原生样式,比较丑~ 我们可以优化一下。我是用js把生成的图片和验证码输入框替换成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', '请输入验证码');
col_16.appendChild(el_input);
 
captcha_input.parentNode.removeChild(captcha_input);
 
row.appendChild(col_8);
row.appendChild(col_16);

登录限流

这个也不复杂,不过我一开始做还是花了比较长时间,查不到什么有用的资料,后面我去读了Django Admin的代码,一下就想出解决方法了哈哈~

通过admin的代码,我发现处理登录是 admin.site.login(request, extra_context) 这个方法,那问题就变得很简单了,给他加一个装饰器就好了,不过我们不能去修改框架的代码,所以自己写一个新的view,如下:

# 覆盖默认的admin登录方法实现登录限流
@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),
]

这样就可以实现限流了,这里要介绍一下 ratelimit 这个装饰器,这是django-ratelimit这个包提供的,为了使用这个包,需要配置redis缓存,附上配置代码:

# 配置redis缓存
CACHES = {
  'default': {
    'BACKEND': 'django_redis.cache.RedisCache', # 缓存后端 Redis
    # 连接Redis数据库(服务器地址)
    # 一主带多从(可以配置个Redis,写走第一台,读走其他的机器)
    'LOCATION': [
      'redis://localhost:6379/0',
    ],
    'KEY_PREFIX': 'milky', # 项目名当做文件前缀
    'OPTIONS': {
      'CLIENT_CLASS': 'django_redis.client.DefaultClient', # 连接选项(默认,不改)
      'CONNECTION_POOL_KWARGS': {
        'max_connections': 512, # 连接池的连接(最大连接)
      },
    }
  }
}

@ratelimit(key='ip', rate='5/m', block=True)key=ip 表示根据ip来区分, rate=5/m 表示一分钟最多请求这个接口5次, block=true 表示超过这个限制就直接拦截,如果没有设置block参数的话,超过限制也不会拦截,但是可以在ratelimit计数器里面看到请求的次数。

更多用法可以看官方文档: 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

到此这篇关于给Django Admin添加验证码和多次登录尝试限制的实现的文章就介绍到这了,更多相关Django Admin验证码和登录限制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
Python求出0~100以内的所有素数
Jan 23 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
Python hashlib模块用法实例分析
Jun 12 Python
python3第三方爬虫库BeautifulSoup4安装教程
Jun 19 Python
python递归实现快速排序
Aug 18 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
Django-migrate报错问题解决方案
Apr 21 Python
Python工程师必考的6个经典面试题
Jun 28 Python
python如何支持并发方法详解
Jul 25 #Python
Python获取浏览器窗口句柄过程解析
Jul 25 #Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 #Python
基于Python实现简单学生管理系统
Jul 24 #Python
用python实现学生管理系统
Jul 24 #Python
Python 解析简单的XML数据
Jul 24 #Python
深入了解NumPy 高级索引
Jul 24 #Python
You might like
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
跟老齐学Python之编写类之二方法
2014/10/11 Python
python打开文件并获取文件相关属性的方法
2015/04/23 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
python频繁写入文件时提速的方法
2019/06/26 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
店长岗位职责
2013/11/21 职场文书
办公室文书岗位职责
2013/12/16 职场文书
新年主持词
2014/03/27 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
2014年政教处工作总结
2014/12/20 职场文书
义卖募捐活动总结
2015/05/09 职场文书
建房合同协议书
2016/03/21 职场文书
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python
mysql查看表结构的三种方法总结
2022/07/07 MySQL