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 相关文章推荐
pymssql数据库操作MSSQL2005实例分析
May 25 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
python+mysql实现个人论文管理系统
Oct 25 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
Python安装使用Scrapy框架
Apr 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 ADODB使用方法集锦
2008/03/25 PHP
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
Python列表append和+的区别浅析
2015/02/02 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
Django框架models使用group by详解
2020/03/11 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
python反扒机制的5种解决方法
2021/02/06 Python
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
什么是接口(Interface)?
2013/02/01 面试题
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
施工安全协议书范本
2014/09/26 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
2019秋季运动会口号
2019/06/25 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技