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实现高效求解素数代码实例
Jun 30 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
使用python将大量数据导出到Excel中的小技巧分享
Jun 14 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
对pyqt5之menu和action的使用详解
Jun 20 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
Python离线安装openpyxl模块的步骤
Mar 30 Python
在pyCharm中下载第三方库的方法
Apr 18 Python
使用Python开发冰球小游戏
Apr 30 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
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
很酷的javascript loading效果代码
2008/06/18 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
阿巴庭院:Abba Patio
2019/06/18 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
交通事故检查书范文
2014/01/30 职场文书
社区庆八一活动方案
2014/02/02 职场文书
干部现实表现材料
2014/02/13 职场文书
园艺师求职信
2014/04/27 职场文书
自荐信模板大全
2015/03/27 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
golang slice元素去重操作
2021/04/30 Golang
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏
Spring中的@Transactional的工作原理
2022/06/05 Java/Android