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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
Python实现将n个点均匀地分布在球面上的方法
Mar 12 Python
简单介绍Python下自己编写web框架的一些要点
Apr 29 Python
python实现多线程抓取知乎用户
Dec 12 Python
Python中元组,列表,字典的区别
May 21 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
Python3中使用PyMongo的方法详解
Jul 28 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
对Django 转发和重定向的实例详解
Aug 06 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
python如何快速生成时间戳
Jul 21 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
php车辆违章查询数据示例
2016/10/14 PHP
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
vue实现树形菜单效果
2018/03/19 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
Flask之flask-script模块使用
2018/07/26 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
光电信息专业应届生求职信
2013/10/07 职场文书
机械系大学毕业生推荐信
2013/11/27 职场文书
学校政风行风整改方案
2014/10/25 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
见习报告的格式
2014/11/04 职场文书
数学教师求职信范文
2015/03/20 职场文书
加薪申请报告范本
2015/05/15 职场文书
复活读书笔记
2015/06/29 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python