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 调用DLL操作抄表机
Jan 12 Python
Python发送form-data请求及拼接form-data内容的方法
Mar 05 Python
Python中import机制详解
Nov 14 Python
python批量替换页眉页脚实例代码
Jan 22 Python
Python中单例模式总结
Feb 20 Python
用python统计代码行的示例(包括空行和注释)
Jul 24 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
Python中作用域的深入讲解
Dec 10 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
python读写数据读写csv文件(pandas用法)
Dec 14 Python
通过python-pptx模块操作ppt文件的方法
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
ajax实现无刷新分页(php)
2010/07/18 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
layui递归实现动态左侧菜单
2019/07/26 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
python字典一键多值实例代码分享
2019/06/14 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
《中国的气候》教学反思
2014/02/23 职场文书
财产公证书样本
2014/04/04 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
党小组鉴定意见
2015/06/02 职场文书
学生会干部任命书
2015/09/21 职场文书
基于Redis过期事件实现订单超时取消
2021/05/08 Redis
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python