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实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
python获取指定路径下所有指定后缀文件的方法
May 26 Python
Python中死锁的形成示例及死锁情况的防止
Jun 14 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
python实现对文件中图片生成带标签的txt文件方法
Apr 27 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
pandas中的series数据类型详解
Jul 06 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
python爬虫爬取图片的简单代码
Jan 18 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
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
Python发送email的3种方法
2015/04/28 Python
Python教程之全局变量用法
2016/06/27 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
Python sys模块常用方法解析
2020/02/20 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
高中英语教学反思
2014/02/04 职场文书
房屋转让协议书范本
2014/04/11 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
团委副书记工作总结
2015/08/14 职场文书
节水宣传标语口号
2015/12/26 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js