Django多方式登录认证
多方式认证原理
我们平常使用的Django登录认证是django.contrib.auth.authenticate

点进去源码,我们会看到这个函数,真正的认证类是它里面的那个

继续点进去源码,会看到ModelBacked类,内部是用户名登录认证校验,它上一层就是基类了,所以我们只要重写这个类的authenticate函数即可。

实现
第一步,写一个函数,继承ModelBackend类,authenticate.py:
import re
from django.contrib.auth.backends import ModelBackend
from users.models import UserInfo
class ReModelBackend(ModelBackend):
"""登录多方式认证类(支持手机号和用户名登录)"""
def authenticate(self, request, username=None, password=None, **kwargs):
"""重写authenticate方法"""
user = self.user_or_none(username)
if user and user.check_password(password):
return user
else:
return None
def user_or_none(self, account):
"""
自定义方法
account: 用户名或手机号
return: user对象或None
"""
is_match = re.match(r"1[3-9]\d{9}$", account)
try:
if is_match:
user = UserInfo.objects.get(mobile=account)
else:
user = UserInfo.objects.get(username=account)
except:
return None
else:
return user
第二步,Django配置,settings.py
# 列表内是导包路径
AUTHENTICATION_BACKENDS = ['extension.authenticate.ReModelBackend']
Django全局配置中也可以看到配置项

第三步,调用,登录视图示例,users/views.py
from django.shortcuts import render, HttpResponse, redirect, reverse
from django.views import View
from django.contrib.auth import login, authenticate
from .forms import LoginForm
from .models import UserInfo
class LoginView(View):
"""登录视图"""
def get(self, request):
return render(request, "login.html")
def post(self, request):
form_obj = LoginForm(request.POST)
if not form_obj.is_valid():
return render(request, "login.html", {"return_msg": "数据校验失败."})
username = form_obj.cleaned_data.get("username")
password = form_obj.cleaned_data.get("password")
remembered = form_obj.cleaned_data.get("remembered")
# 多方式认证登录
user = authenticate(username=username, password=password)
if not user:
return render(request, "login.html", {"return_msg": "用户名或密码错误."})
login(request, user)
# 设置失效时间
if not remembered:
request.session.set_expiry(0)
else:
request.session.set_expiry(None)
return redirect(reverse("contents:index"))
登录表单认证,users/forms.py
from django import forms
from .models import UserInfo
class LoginForm(forms.Form):
username = forms.CharField(max_length=20, min_length=5, required=True, label="用户名", error_messages={
"max_length": "用户名最大长度为20",
"min_length": "用户名最小长度为5",
"required": "用户名不能为空"
})
password = forms.CharField(max_length=20, min_length=8, required=True, label="密码", error_messages={
"max_length": "密码最大长度为20",
"min_length": "密码最小长度为8",
"required": "密码不能为空"
})
remembered = forms.BooleanField(required=False)
Django多方式登录认证的更多相关文章
- 关于django用户登录认证中的cookie和session
最近弄django的时候在用户登录这一块遇到了困难,网上的资料也都不完整或者存在缺陷. 写这篇文章的主要目的是对一些刚学django的新手朋友提供一些帮助.前提是你对django中的session和c ...
- Django之auth登录认证
前言:我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的 ...
- django rest_framework 实现用户登录认证
django rest_framework 实现用户登录认证 1.安装 pip install djangorestframework 2.创建项目及应用 创建过程略 目录结构如图 3.设置setti ...
- Django组件之认证系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...
- Django集成OpenLDAP认证
本文详细介绍了django-auth-ldap的使用方法,参数含义,并提供了示例代码 版本说明 Django==2.2 django-auth-ldap==1.7.0 集成过程 Django集成LDA ...
- python 全栈开发,Day79(Django的用户认证组件,分页器)
一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...
- django之auth认证系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...
- Luffy之登录认证以及JWT
1.用户认证 在前面我们已经完成了,前端登录页面的搭建,以及路由分配,现在我们作关于登录认证部分的东西 Django提供了认证系统.认证系统包含: 用户 权限:二元(是/否)标志指示一个用户是否可以做 ...
- COOKIE与SESSION、Django的用户认证、From表单
一.COOKIE 与 SESSION 1.简介 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. ...
- Django Authentication 用户认证系统
一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...
随机推荐
- [转帖]Elasticsearch 技术分析(七): Elasticsearch 的性能优化
https://www.cnblogs.com/jajian/p/10176604.html 硬件选择# Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储 ...
- [转帖] mysql的timestamp会存在时区问题?
我感觉 这样理解也有点不对 timestamp 应该是不带时区 只是 UTC1970-1-1 的时间戳 但是展示时会根据时区做一下计算 date time 就不会做转换而已. 原创:打码日记(微信 ...
- 工单 工序外协 更改PR/PO
工序外协详解介绍'https://blog.csdn.net/weixin_43814706/article/details/113586961' 需求:创建工序委外的工单时更改对应PR/PO 行文本 ...
- ClickHouse(08)ClickHouse表引擎概况
目录 合并树家族 日志引擎系列 集成的表引擎 其他特殊的引擎 资料分享 参考文章 目前ClickHouse的表引擎主要有下面四个系列,合并树家族.日志引擎系列.集成的表引擎和其他特殊的引擎. 合并树家 ...
- webservice 发布与使用
WebService,即Web服务,能使得运行在不同机器上的不同应用无须借助,专门的第三方软件或硬件,就可相互交换数据或集成. 第一次选择WebService,是为了替代数据库远程连接.我们都知道当S ...
- svn把文件日期设置为最后提交的时间
在使用svn进行checkout或update时,我想让文件的日期为提交那时的日期,这要怎样做? 说明:我是在windows下使用TortoiseSVN进行操作的 方法1.修改config [misc ...
- 【7】vscode不同的窗口样式和颜色插件peacock、设置打开多个窗口、md文件打开方式和预览以及插入目录
相关文章: [1]VScode中文界面方法-------超简单教程 [2]VScode搭建python和tensorflow环境 [3]VSCode 主题设置推荐,自定义配色方案,修改注释高亮颜色 [ ...
- 4.1 C++ STL 动态链表容器
List和SList都是C++ STL中的容器,都是基于双向链表实现的,可以存储可重复元素的特点.其中,List内部的节点结构包含两个指针一个指向前一个节点,一个指向后一个节点,而SList只有一个指 ...
- Redis订阅模式在生产环境引起的内存泄漏
内存泄漏 内存泄漏指的就是在运行过程中定义的各种各样的变量无法被垃圾回收器正常标记为不可达并触发后续的回收流程,主要原因还是因为对可回收对象引用没有去除,导致垃圾回收器通过GC ROOT可达性分析时认 ...
- CommentTest
public class CommentTest{ /* 这是多行注释 可以声明多行注释的信息 1. Java注释的种类: 单行注释,多行注释,文档注释(Java特有) 2. 单行注释,多行注释 ① ...