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采集博客中上传的QQ截图文件
Jul 18 Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 Python
python中virtualenvwrapper安装与使用
May 20 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
Python获取网段内ping通IP的方法
Jan 31 Python
Python字符串的常见操作实例小结
Apr 08 Python
对python中的*args与**kwgs的含义与作用详解
Aug 28 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
python如何控制进程或者线程的个数
Oct 16 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
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
基于javascript实现样式清新图片轮播特效
2016/03/30 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python获取mp3文件信息的方法
2015/06/15 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
python实现滑雪游戏
2020/02/22 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
python爬虫可以爬什么
2020/06/16 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
预备党员承诺书
2014/03/25 职场文书
企业安全生产承诺书
2014/05/22 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
独生子女证明范本
2015/06/19 职场文书
植树节新闻稿
2015/07/17 职场文书