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 实现文件的递归拷贝实现代码
Aug 02 Python
python正则分析nginx的访问日志
Jan 17 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
python中logging包的使用总结
Feb 28 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
pytorch数据预处理错误的解决
Feb 20 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
Python -m参数原理及使用方法解析
Aug 21 Python
python 决策树算法的实现
Oct 09 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 02 Python
Python爬虫网络请求之代理服务器和动态Cookies
Apr 12 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下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
PHP 八种基本的数据类型小结
2011/06/01 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
php对数组排序代码分享
2014/02/24 PHP
stripos函数知识点实例分享
2019/02/11 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
jQuery使用手册之一
2007/03/24 Javascript
fckeditor 获取文本框值的实现代码
2009/02/09 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
python实现划词翻译
2020/04/23 Python
Python调用C语言开发的共享库方法实例
2015/03/18 Python
Python3遍历目录树实现方法
2015/05/22 Python
python的依赖管理的实现
2019/05/14 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
大学军训感言600字
2014/02/25 职场文书
我爱读书演讲稿
2014/05/07 职场文书
匿名信格式范文
2015/05/27 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
大学生军训感言
2015/08/01 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python