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 中文字符串的处理实现代码
Oct 25 Python
Python程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
用Python实现换行符转换的脚本的教程
Apr 16 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
Python for循环中的陷阱详解
Jul 13 Python
创建Django项目图文实例详解
Jun 06 Python
python中property属性的介绍及其应用详解
Aug 29 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
如何利用python生成MD5并去重
Dec 07 Python
Python制作动态字符画的源码
Aug 04 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
树型结构列出指定目录里所有文件的PHP类
2006/10/09 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
php简单获取目录列表的方法
2015/03/24 PHP
php抽象类用法实例分析
2015/07/07 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
web.py在模板中输出美元符号的方法
2014/08/26 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
Python玩转Excel的读写改实例
2019/02/22 Python
Tornado实现多进程/多线程的HTTP服务详解
2019/07/25 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
美国手机支架公司:PopSockets
2019/11/27 全球购物
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
优秀经理事迹材料
2014/02/01 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
消防安全培训工作总结
2015/10/23 职场文书