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 相关文章推荐
web.py中调用文件夹内模板的方法
Aug 26 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
python 自动化将markdown文件转成html文件的方法
Sep 23 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
儿童学习python的一些小技巧
May 27 Python
python迭代dict的key和value的方法
Jul 06 Python
python利用跳板机ssh远程连接redis的方法
Feb 19 Python
python多线程与多进程及其区别详解
Aug 08 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 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中上传大体积文件时需要的设置
2006/10/09 PHP
php下的权限算法的实现
2007/04/28 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
Web程序工作原理详解
2014/12/25 PHP
PHP生成器简单实例
2015/05/13 PHP
微信支付的开发流程详解
2016/09/13 PHP
php实现文件预览功能
2017/05/23 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
Python中给List添加元素的4种方法分享
2014/11/28 Python
python求质数的3种方法
2018/09/28 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
python 实现批量图片识别并翻译
2020/11/02 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
新西兰优惠网站:Treat Me
2019/07/04 全球购物
EJB发布WEB服务一般步骤
2012/10/31 面试题
幼儿教师思想汇报
2014/01/10 职场文书
房地产广告策划方案
2014/05/15 职场文书
大学专科自荐信
2014/06/17 职场文书
学生检讨书范文
2015/01/27 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python