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网络爬虫采集联想词示例
Feb 11 Python
Python描述器descriptor详解
Feb 03 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
Python中查看文件名和文件路径
Mar 31 Python
Python中的TCP socket写法示例
May 11 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
python和mysql交互操作实例详解【基于pymysql库】
Jun 04 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
python 调用Google翻译接口的方法
Dec 09 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生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
详解Vue之计算属性
2020/06/20 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
Python验证码识别的方法
2015/07/10 Python
Python部署web开发程序的几种方法
2017/05/05 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
python验证身份证信息实例代码
2019/05/06 Python
在python中用url_for构造URL的方法
2019/07/25 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
数据保密承诺书
2014/06/03 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年保育员工作总结
2014/12/02 职场文书
党性分析材料格式
2014/12/19 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python