多方式认证原理

我们平常使用的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多方式登录认证的更多相关文章

  1. 关于django用户登录认证中的cookie和session

    最近弄django的时候在用户登录这一块遇到了困难,网上的资料也都不完整或者存在缺陷. 写这篇文章的主要目的是对一些刚学django的新手朋友提供一些帮助.前提是你对django中的session和c ...

  2. Django之auth登录认证

    前言:我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的 ...

  3. django rest_framework 实现用户登录认证

    django rest_framework 实现用户登录认证 1.安装 pip install djangorestframework 2.创建项目及应用 创建过程略 目录结构如图 3.设置setti ...

  4. Django组件之认证系统

      Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...

  5. Django集成OpenLDAP认证

    本文详细介绍了django-auth-ldap的使用方法,参数含义,并提供了示例代码 版本说明 Django==2.2 django-auth-ldap==1.7.0 集成过程 Django集成LDA ...

  6. python 全栈开发,Day79(Django的用户认证组件,分页器)

    一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...

  7. django之auth认证系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  8. Luffy之登录认证以及JWT

    1.用户认证 在前面我们已经完成了,前端登录页面的搭建,以及路由分配,现在我们作关于登录认证部分的东西 Django提供了认证系统.认证系统包含: 用户 权限:二元(是/否)标志指示一个用户是否可以做 ...

  9. COOKIE与SESSION、Django的用户认证、From表单

    一.COOKIE 与 SESSION 1.简介 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. ...

  10. Django Authentication 用户认证系统

    一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...

随机推荐

  1. [转帖]VMware常用软件ISO下载汇总(2023年6月更新)

    https://www.dinghui.org/vmware-iso-download.html#vcsa-patch 请访问 www.dinghui.org 获得最新版,文章将持续更新.[最后更新时 ...

  2. [转帖]NVMe 与 AHCI

    https://www.cnblogs.com/zengkefu/p/5634345.html http://elf8848.iteye.com/blog/1731274 AHCI: NCQ技术,60 ...

  3. [转帖]MIPS和ARM授权差异引起的龙芯路线变迁

    https://zhuanlan.zhihu.com/p/99807721 一.MIPS和ARM授权的异同 MIPS授权和ARM授权都分为处理器核授权(Core License)和架构授权(Archi ...

  4. vue如何在render函数中循环(3)

    h函数的三个参数 第一个参数是必须的. 类型:{String | Object | Function} 一个 HTML 标签名.一个组件.一个异步组件.或一个函数式组件. 是要渲染的html标签. 第 ...

  5. Go 跟踪函数调用链,理解代码更直观

    Go 跟踪函数调用链,理解代码更直观 目录 Go 跟踪函数调用链,理解代码更直观 一.引入 二.自动获取所跟踪函数的函数名 三.增加 Goroutine 标识 四.让输出的跟踪信息更具层次感 五.利用 ...

  6. 小白学k8s(6)使用kubespray部署k8s

    kubespray部署k8s 准备 需要关闭防火墙 配置hosts 处理镜像 配置文件 运行 通过对应的镜像 运行代码 查看结果 出现的问题 墙 错误的配置 kubespray部署k8s 准备 kub ...

  7. 搭建mongo的replica set

    搭建mongo的replica set 前言 安装 构建副本集 加入认证 备份数据 备份数据到本地 数据恢复 搭建mongo的replica set 前言 准备三台机器,相互可以访问的.处理思路,先构 ...

  8. C/C++ Crypto密码库调用方法

    Crypto 库是C/C++的加密算法库,这个加密库很流行,基本上涵盖了市面上的各类加密解密算法,以下代码是我在学习是总结的,放到这里用于后期需要时能够快速解决问题. 项目地址:https://www ...

  9. Flask 框架:实现简单API测试接口

    通过使用Python中Flask框架实现一个简单的API接口程序,用户可发送JSON格式的请求,服务器响应请求,并以JSON格式将数据返回给用户,此处代码是一个模板可以测试接口时使用. Flask代码 ...

  10. 面试谈薪4点博弈策略,将20k谈到28k

    薪资谈判本质上是一种博弈,无论是表面谈得好还是实质上谈得好,都需要掌握一些策略 面试薪资怎么谈,您目前的薪资是20k,如果您想要提高到28k,那么请花两分钟看完以下内容.薪资谈判本质上是一种博弈,无论 ...