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的认证系统包含了身份验证和权限管理两部分.简单地说 ...
随机推荐
- [转帖]一文解决内核是如何给容器中的进程分配CPU资源的?
https://zhuanlan.zhihu.com/p/615570804 现在很多公司的服务都是跑在容器下,我来问几个容器 CPU 相关的问题,看大家对天天在用的技术是否熟悉. 容器中的核是真 ...
- [转帖]Docker限制容器的资源
docker在默认运行容器的情况下,是不会对运行的容器进行资源限制的,在自己的实验环境的话是随便你怎么弄的,不过在生产中是一定会对docker运行的容器进行资源限制的,如果不限制的话在生产中会带来 ...
- [转帖]SpecCPU2017 测试cpu性能
https://www.bbsmax.com/A/GBJrxP1Ed0/ SpecCPU介绍见: https://blog.csdn.net/qq_36287943/article/details/1 ...
- [转帖]016 Linux 卧槽,看懂进程信息也不难嘛?top、ps
016 Linux 卧槽,看懂进程信息也不难嘛?top.pshttps://my.oschina.net/u/3113381/blog/5455267 1 扒开看看 top 命令参数详情 Linux ...
- 部署于K8S集群上面应用性能影响点推测
前言 本人2017年第一次接触K8S. 中间断断续续学习K8S相关的内容. 但是最近一年,几乎没太有学习. 因为之前学习了四五年, 一直以为产品马上要用 结果一直被浇冷水. 去年开始学乖了. 不这么搞 ...
- 使用Docker快速搭建InnoDB Cluster集群的过程
感谢 感谢方神的大力帮助,自己对数据库基本一窍不通.只是照葫芦画瓢做出来的. 感谢来自如下两个网站的资料,我进行了一定程度的融合. https://blog.csdn.net/weixin_43972 ...
- 一条sql了解MYSQL的架构设计
1 前言 对于一个服务端开发来说 MYSQL 可能是他使用最熟悉的数据库工具,然而,大部分的Java工程师对MySQL的了解和掌握程度,大致就停留在这么一个阶段:它可以建库.建表.建索引,然后就是对里 ...
- C# await和Result对比
1.Result 上图是微软官网的截图,由图可知在使用GetXXXX的方法的时候,会阻塞调用其他线程,直到当前异步操作完成,相当于调用wait方法.但是使用异步编程应该避免使用TASK.WAIT或TA ...
- 从零开始配置 vim(15)——状态栏配置
vim 下侧有一个状态栏,会显示当前打开的文件等一系列内容,只是我们很少去关注它.而且原生的vim也支持对状态栏进行自定义.这篇文章主要介绍如何自定义状态栏 设置状态栏 我们可以采用 set stat ...
- TienChin 活动管理-修改活动
后端 ChannelController.java @PreAuthorize("hasPermission('tienchin:channel:edit')") @GetMapp ...