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实现发送email的几种常用方法
Aug 18 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
理解Python中的绝对路径和相对路径
Aug 30 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
使用python3构建文件传输的方法
Feb 13 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
Python无头爬虫下载文件的实现
Apr 02 Python
详解Django配置JWT认证方式
May 09 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 Python
virtualenv隔离Python环境的问题解析
Jun 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的大小写敏感问题整理
2011/12/29 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
python获取元素在数组中索引号的方法
2015/07/15 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
python基础教程之五种数据类型详解
2017/01/12 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
Python分类测试代码实例汇总
2020/07/23 Python
Python 创建TCP服务器的方法
2020/07/28 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
生产车间班组长岗位职责
2014/01/06 职场文书
广告学专业求职信
2014/06/19 职场文书
2015年学校消防安全工作总结
2015/10/14 职场文书
导游词之台湾阿里山
2019/10/23 职场文书