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实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
python 写的一个爬虫程序源码
Feb 28 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
Jan 04 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
Python中extend和append的区别讲解
Jan 24 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
selenium+Chrome滑动验证码破解二(某某网站)
Dec 17 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
Python 实现将某一列设置为str类型
Jul 14 Python
Pythonic版二分查找实现过程原理解析
Aug 11 Python
Python实现Telnet自动连接检测密码的示例
Apr 16 Python
Python爬虫基础讲解之请求
May 13 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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
常用jQuery代码分享
2015/07/14 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
python妙用之编码的转换详解
2017/04/21 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Python实现随机选择元素功能
2017/09/14 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
Python异常处理操作实例详解
2018/05/10 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
python实现图片上添加图片
2019/11/26 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
运动会广播稿30字
2014/01/21 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书