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中的闭包用法实例详解
May 05 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
Python Socket传输文件示例
Jan 16 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
Django应用程序入口WSGIHandler源码解析
Aug 05 Python
python多线程同步之文件读写控制
Feb 25 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
Python集合操作方法详解
Feb 09 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
python实现文件分片上传的接口自动化
Nov 19 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 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的配置文件php.ini
2006/10/09 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
python里运用私有属性和方法总结
2019/07/08 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
加热夹克:RAVEAN
2018/10/19 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
什么是View State?
2013/01/27 面试题
毕业生找工作推荐信
2013/11/21 职场文书
会计应届生的自荐信
2013/12/13 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
六年级学生评语大全
2014/12/26 职场文书
大学生党员个人总结
2015/02/13 职场文书
经销商会议开幕词
2016/03/04 职场文书
原生JS实现分页
2022/04/19 Javascript