Python如何实现后端自定义认证并实现多条件登陆


Posted in Python onJune 22, 2020

1.须知

JWT扩展的登录视图,在收到用户名与密码时,也是调用Django的认证系统Auth模型中提供的**authenticate()**来检查用户名与密码是否正确。

我们可以通过修改Django认证系统的认证后端(主要是authenticate方法)来支持登录账号既可以是用户名也可以是手机号。

`authenticate(self, request, username=None, password=None, **kwargs)`方法的参数说明:

  • - request 本次认证的请求对象
  • - username 本次认证提供的用户账号
  • - password 本次认证提供的密码

我们想要让用户既可以以用户名登录,也可以以手机号登录,那么对于authenticate方法而言,username参数即表示用户名或者手机号。

重写authenticate方法的思路:

1. 根据username参数查找用户User对象,username参数可能是用户名,也可能是手机号
2. 若查找到User对象,调用User对象的check_password方法检查密码是否正确

2. 添加自定义认证函数,在users/utils.py中编写:

"""实现多条件登录"""
from django.contrib.auth.backends import ModelBackend
from .models import User
from django.db.models import Q

def get_user_by_account(account):
  """通过账号信息获取用户"""
  try:
    user = User.objects.get(Q(username=account) | Q(mobile=account) )
  except User.DoesNotExist:
    user = None
  return user

class UsernameMobileAuthBackend(ModelBackend):
  def authenticate(self, request, username=None, password=None, **kwargs):
    # 获取用户
    user = get_user_by_account(username)

    # 验证密码和是否允许登录
    if user is not None and user.check_password(password) and self.user_can_authenticate(user):
      return user

3.在配置文件settings/dev.py中告知Django使用我们自定义的认证后端

AUTHENTICATION_BACKENDS = [
'users.utils.UsernameMobileAuthBackend',
]

在配置文件中进行设置,就是将自定义认证函数的地址告知django认证系统

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Django日志模块logging的配置详解
Feb 14 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
python读取LMDB中图像的方法
Jul 02 Python
python中的turtle库函数简单使用教程
Jul 23 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
Python中if有多个条件处理方法
Feb 26 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
May 17 Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 Python
python re模块和正则表达式
Mar 24 Python
PyTorch 如何自动计算梯度
May 23 Python
零基础小白多久能学会python
Jun 22 #Python
Keras-多输入多输出实例(多任务)
Jun 22 #Python
python和c语言哪个更适合初学者
Jun 22 #Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 #Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 #Python
keras 多任务多loss实例
Jun 22 #Python
python对execl 处理操作代码
Jun 22 #Python
You might like
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
javascript加号"+"的二义性说明
2013/03/04 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
Web服务器框架 Tornado简介
2014/07/16 Python
如何基于Python创建目录文件夹
2019/12/31 Python
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
商务英语专业毕业生自荐信
2013/11/05 职场文书
服务员岗位职责
2014/01/29 职场文书
2015年项目工作总结
2015/04/29 职场文书
python 破解加密zip文件的密码
2021/04/22 Python
微信小程序实现录音Record功能
2021/05/09 Javascript