首页 > 其他分享 >Django多方式登录认证

Django多方式登录认证

时间:2023-08-05 14:01:21浏览次数:30  
标签:password return 登录 request 认证 authenticate user import Django

多方式认证原理

我们平常使用的Django登录认证是django.contrib.auth.authenticate

image-20230805124610375

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

image-20230805124703088

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

image-20230805124747862

实现

第一步,写一个函数,继承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全局配置中也可以看到配置项

image-20230805134835504

第三步,调用,登录视图示例,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)

标签:password,return,登录,request,认证,authenticate,user,import,Django
From: https://www.cnblogs.com/hkwJsxl/p/17607863.html

相关文章

  • apache开启密码认证
    环境:centos6.91、配置文件增加vim/etc/httpd/conf/httpd.conf,页面认证选项2、增加认证用户和密码htpasswd-c/etc/httpd/conf/httpusertom3、效果4、增加安全性......
  • Celery在Django项目中集成
    使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例对象,我们一般叫做celery应用对象,或者更简单直接叫做一个app。app应用对象是我们使用celery所有功能的入口,比如启动celery、创建任务,管理任务,执行任务等.celery框架有2种使用方式,一种是单独一个项目目录,另一种就是......
  • django开发的safe过滤器适用
    django_safe在自己开发的博客系统当中,如果使用django框架,那么在发布博客内容的时候,希望可以发布一些被渲染过的样式文本,比如说图片等。下面是发布文章用到的代码#views.pydefarticle_detail(request,username,article_id):user=UserInfo.objects.filter(username=use......
  • django(ORM、数据库)
    一单表(增、删、改、查)1测试脚本'''只想测试django中的某一个py文件内容,那么可以不用书写前后端交互的形式而是直接写一个测试脚本即可'''#脚本代码无论是写在应用下的tests.py,还是自己单独开设py文件都可以#测试环境的准备,去manage.py中拷贝前四行代码,然后自己写两......
  • 外键字段的增删改查、多表查询、正反向的概念、子查询、多表查询之连表查询、聚合函数
    外键字段的增删改查多对多的外键增删改查图书和作者是多对多,借助于第三张表实现的,如果想绑定图书和作者的关系,本质上就是在操作第三方表操作第三张表问题:让你给图书添加一个作者,他俩的关系可是多对多让你给图书id=2添加一个作者id=1add方法book_obj=models.Book.objects......
  • 扩展Django:实现自己的manage命令
    我们都用过Django的django-admin.py和manage.py。django-admin.py是一个命令行工具,可以执行一些管理任务,比如创建Django项目。而manage.py是在创建每个Djangoproject时自动添加在项目目录下的,只是对manage.py的一个简单包装,其功能是将Djangoproject放到sys.path目录中,同时设置DJ......
  • Django-4.2博客开发教程:初识模板(九)
    一、模板简介为了更好的维护和展示页面数据,使用直接返回数据显然是呆板的,不够美观,不够灵活,所以要使用模板。模板一般都放到项目根目录下的templates文件夹里。模板包含一些基础的HTML代码和一些特殊的语法,通过特殊的语法将数据动态的插入HTML页面中。特殊的语法中有一些变量......
  • springboot+mysql简单的登录系统
    springboot+mysql简单的登录系统pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=&q......
  • linux设置登录失败处理功能(密码错误次数限制、pam_tally2.so模块)和操作超时退出功能(/e
    原文链接:https://blog.csdn.net/hjxloveqsx/article/details/129004832一、登录失败处理功能策略1、登录失败处理功能策略(服务器终端)(1)编辑系统/etc/pam.d/system-auth文件,在auth字段所在的那一部分添加如下pam_tally2.so模块的策略参数:authrequiredpam_tally2.soonerr=fa......
  • 合合信息通过ISO/IEC国际标准双认证,为全球用户提供高合规标准AI服务
    互联网、AI等技术的全球普及为人们提供便捷服务的同时,也带来了信息安全领域的诸多挑战。保护用户隐私及数据安全,是科技企业规范、健康发展的重心。近期,上海合合信息科技股份有限公司(简称“合合信息”)顺利通过国际权威认证机构DNV审核,获得ISO/IEC27001信息安全管理体系及ISO/IEC2......