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 多线程应用介绍
Dec 19 Python
python实现多线程的两种方式
May 22 Python
Python中用psycopg2模块操作PostgreSQL方法
Nov 28 Python
python爬虫实例详解
Jun 19 Python
python实现顺序表的简单代码
Sep 28 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
Python Pandas分组聚合的实现方法
Jul 02 Python
Tensorflow 实现释放内存
Feb 03 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Python flask框架如何显示图像到web页面
Jun 03 Python
python实现视频压缩功能
Dec 18 Python
Python3中对json格式数据的分析处理
Jan 28 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 Directory 函数的详解
2013/03/07 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
对python使用http、https代理的实例讲解
2018/05/07 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
医学生实习自荐信
2013/10/01 职场文书
小学教师事迹材料
2014/01/13 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
元旦联欢会主持词
2014/03/26 职场文书
高中家长寄语
2014/04/02 职场文书
大学班级计划书
2014/04/29 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
新教师教学工作总结
2015/08/14 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书