Django自定义用户登录认证示例代码


Posted in Python onJune 30, 2019

前言

有时候 Django 自带的用户登录认证不能满足我们的需求,比如我不想要用户名+密码登录,我想手机号+验证码登录,这样就需要我们去修改 Django 自带的认证了。

Django 默认使用用户认证的是ModelBackend,这个类也就是我们要下手的地方,ModelBackend里面有一个authenticate的方法,这个方法就是登录时对用户认证的方法。我们要改的就是这个方法。

先看看原码理解一下认证逻辑:

Django自定义用户登录认证示例代码

第15-16行先获取认证用的用户名字段,默认是username,如果在Usermodel里面重新定义了USERNAME_FIELD,如改为USERNAME_FIELD = 'mobile',那么现在就是以手机号来登录了。

第18-22行就是根据 username 去获取 user 对象,如果没有这个 user 就做一次密码 hasher (不太理解这里的作用,不过不影响修改),然后就退出方法了。

第24-25行就是获取到用户后,验证用户传过来的密码跟数据库里的是否一致并且该用户是否有登录权限,验证都通过后就把 user 返回去,否则退出返回,不返回任何东西。

明白了认证的逻辑,就开始修改了,首先新建一个类,继承ModelBackend,然后重写authenticate方法,比如上面提到的改为手机号+验证码的方式,只要改成如下:

Django自定义用户登录认证示例代码

只是稍微的做了点修改,把第24行里的密码验证改为了验证码验证,这里password 字段用于存放验证码,而不再是用户的密码了。其它的逻辑都没变。

这里改了之后,要在Usermodel 里加上check_verify_code这个方法,否则会报错,还要修改类变量USERNAME_FIELD = 'mobile',不然还是会以username来认证,具体的实现逻辑根据自己的实际情况来,这里就不展示里面的逻辑。

好,用户的认证改好了,还有最重要的一步,在settings.py里添加一条这样的配置:

AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends']  # 里面改成自己写的认证类。格式必须是 包名.文件名.类名

到此就完成了。

总结:(以手机号+验证码为例)

  1. 新建一个 CustomModelBackend 类,重写 authenticate 方法,根据自己实际需求写认证逻辑。
  2. 在Usermodel里添加验证验证码的方法。
  3. 在Usermodel里改变类变量USERNAME_FIELD为mobile。
  4. 在在settings.py里添加一条配置:

AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends']

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中使用 Selenium 实现网页截图实例
Jul 18 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
python散点图实例之随机漫步
Aug 27 Python
python实现简易数码时钟
Feb 19 Python
利用ctypes获取numpy数组的指针方法
Feb 12 Python
python 返回一个列表中第二大的数方法
Jul 09 Python
tensorflow 查看梯度方式
Feb 04 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 #Python
Python中请不要再用re.compile了
Jun 30 #Python
用python求一个数组的和与平均值的实现方法
Jun 29 #Python
Python:Numpy 求平均向量的实例
Jun 29 #Python
python 计算数据偏差和峰度的方法
Jun 29 #Python
Python求均值,方差,标准差的实例
Jun 29 #Python
python 计算平均平方误差(MSE)的实例
Jun 29 #Python
You might like
PHP中防止SQL注入实现代码
2011/02/19 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
基于Python实现定时自动给微信好友发送天气预报
2018/10/25 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
销售人员个人求职信
2013/09/26 职场文书
自我评价怎么写好呢?
2013/12/05 职场文书
学生操行评语大全
2014/04/24 职场文书
承诺函格式模板
2015/01/21 职场文书
捐资助学感谢信
2015/01/21 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python