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的认证系统包含了身份验证和权限管理两部分.简单地说 ...
随机推荐
- [转帖]AMD第四代宵龙 9174F 亮眼
https://www.amd.com/zh-hans/processors/epyc-9004-series#%E8%A7%84%E6%A0%BC 型号规格 型号 CPU 核心数量 线程数量 最 ...
- [转帖]Linux内核网络中的软中断ksoftirqd
https://zhuanlan.zhihu.com/p/361976930 1. 前言 之前分享过Linux内核网络数据包的接收过程,当执行到网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了, ...
- 微信小程序之某个节点距离顶部和底部的距离 createSelectorQuery
这个方法可以用来在上滑滚动的时候,让某一个区域置顶, 在下滑的时候,又变为原来的位置哈! <huadong :class="{'hident':isFixed}" id=&q ...
- 大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求
大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求 一个面向多模式GPT-4级别能力构建的助手.它结合了自然语言处理和计算机视觉,为用户提供了强大的多模式交互和理解.LL ...
- 7.3 通过API枚举进程
首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如P ...
- C/C++ 实现URL路径拆分
URL路径拆分: 例如我们传入 http://www.baidu.com/index.php 拆分为 www.baidu.com 和 /index.php #include <Windows.h ...
- centos6.5安装MongoDB4.4.23
前言 1.目前MongoDB最新稳定版本是:6.0.8 2.MongoDB 5+和6+版本已不支持centos6.2+系统,参考https://docs.mongoing.com/install-mo ...
- Windows10安装Apache2.4.54并配置PHP5.6.40/PHP8.1.11
环境 Windows 10 Apache2.4.54 PHP5.6.40/PHP8.1.11 安装Microsoft Visual C++ 下载地址:https://learn.microsoft.c ...
- 让 JuiceFS 帮你做好「异地备份」
家住北京西二旗的小张是一家互联网金融公司的运维工程师,金融行业的数据可是很值钱的,任何的损坏和丢失都不能容忍. 为此,小张选了北京品质最高的机房,买了品质最好的硬件,做了全面的数据备份容灾策略: 每 ...
- mybatis批量插入支持默认值和自定义id生成策略的免写sql插件
最近做项目时用了免写sql的插件但是发现批量操作不满足现有需求.所以,在原有基础之上扩展了批量的操作支持[支持插入默认值和自定义id生成策略].使用方法如下: 一:在pom文件中引入jar配置 < ...