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遍历 truple list dictionary的几种方法总结
Sep 11 Python
对Python中内置异常层次结构详解
Oct 18 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
Python依赖包整体迁移方法详解
Aug 15 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
python科学计算之narray对象用法
Nov 25 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
python__new__内置静态方法使用解析
Jan 07 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
Python龙贝格法求积分实例
Feb 29 Python
python中for in的用法详解
Apr 17 Python
python基础之文件操作
Oct 24 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
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
php-fpm中max_children的配置
2019/03/15 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
Javascript 强制类型转换函数
2009/05/17 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
mpvue 单文件页面配置详解
2018/12/02 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
layui关闭层级、简单监听的实例
2019/09/06 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
python爬取网页转换为PDF文件
2018/06/07 Python
Python最小二乘法矩阵
2019/01/02 Python
Python线程之定位与销毁的实现
2019/02/17 Python
pycharm 安装JPype的教程
2019/08/08 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
pandas参数设置的实用小技巧
2020/08/23 Python
JSF的标签库有哪些
2012/04/27 面试题
委托协议书范本
2014/04/22 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
宣传普通话标语
2014/06/27 职场文书
科技活动总结范文
2015/05/11 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书