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的几种开发工具介绍
Mar 07 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
win10环境下python3.5安装步骤图文教程
Feb 03 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
浅析Python语言自带的数据结构有哪些
Aug 27 Python
wxPython色环电阻计算器
Nov 18 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
在pycharm中实现删除bookmark
Feb 14 Python
python实现文件分片上传的接口自动化
Nov 19 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 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&mysql(六)
2006/10/09 PHP
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
JS排序之快速排序详解
2017/04/08 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
聊聊python中的异常嵌套
2020/09/01 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
Weblogc domain问题
2014/01/27 面试题
历史专业个人求职信分享
2013/12/20 职场文书
妈妈活动方案
2014/08/15 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
2014年行政工作总结
2014/11/19 职场文书
简爱电影观后感
2015/06/10 职场文书
同乡会致辞
2015/07/30 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python