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文件操作类操作实例详解
Jul 11 Python
python随机生成指定长度密码的方法
Apr 04 Python
在Django的URLconf中进行函数导入的方法
Jul 18 Python
浅谈python中set使用
Jun 30 Python
Python环境变量设置方法
Aug 28 Python
python自动发送测试报告邮件功能的实现
Jan 22 Python
python实现局域网内实时通信代码
Dec 22 Python
python deque模块简单使用代码实例
Mar 12 Python
python实现udp传输图片功能
Mar 20 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 Python
pytorch 一行代码查看网络参数总量的实现
May 12 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求最大子序列和的算法实现
2011/06/24 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
Vue-Router进阶之滚动行为详解
2017/09/13 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
css sprite简单实例
2016/05/23 HTML / CSS
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
Linux的主要特性
2016/09/03 面试题
实习生自我鉴定范文
2013/12/05 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
Python中的 enumerate和zip详情
2022/05/30 Python
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python