当前位置: 首页 > article >正文

Django多字段认证的实现

Django多字段认证

需求:

django认证的检查用户是username,如果使用 username和 手机号验证登录。

重写:

ModelBackend 类下的 authenticate 方法

# 在对应应用下创建 utils.py

""" 修改Django认证类,为了实现 username和手机号登录 """

from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

from .models import User


def get_user_by_account(account):
    """
    通过传入的账号动态获取 user 模型对象
    :param account: 有可能是手机号,有可能是用户名
    :return: 返回user对象或None
    """
    try:
        # Q查询  |:或; &:与; ~:非;
        user = User.objects.get(Q(username=account) | Q(mobile=account))
    except User.DoesNotExist as e:
        logger.error(f"No user found with account: {account}. Error: {e}")
        return None
    else:
        # 这里返回的是 User 模型的一个实例(即一个用户对象),不是 User 模型类本身。
        return user


class UsernameModelAuthBackend(ModelBackend):
    # 重写 ModelBackend类下的 authenticate 方法
    def authenticate(self, request, username=None, password=None, **kwargs):
    # 获取user
        user = get_user_by_account(account=username)
        # 判断前端传入的密码是否正确
        if user and user.check_password(password):
            logger.info(f'{user} ,authentication is successful ')
            # 返回user
            return user
        # 如果没有找到用户或密码不正确,返回 None
        logger.warning("Authentication failed: either the user does not exist or the password is incorrect.")
        return None
修改setting.py
# setting.py

""" 修改django认证后端类 """
# django认证的检查用户是username, 默认是 django.contrib.auth.backends.ModelBackend
# AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"]
# 修改为自定义的用户验证类, 它也继承了 ModelBackend, 导包
AUTHENTICATION_BACKENDS = ['users.utils.UsernameModelAuthBackend']

http://www.kler.cn/a/458822.html

相关文章:

  • 高效使用AI完成编程项目任务的指南:从需求分析到功能实现
  • TCP粘/拆包----自定义消息协议
  • MySQL与标准SQL的区别
  • 使用连字符容易出错,尽量使用驼峰式的
  • 简易屏幕共享工具-基于WebSocket
  • 015-spring-动态原理、AOP的xml和注解方式
  • python脚本加载ui页面:PySide6设计的页面
  • SQL 实战:窗口函数进阶 – 实现复杂滑动窗口与动态累计计算
  • 大数据与机器学习(它们有何关系?)
  • Mac电脑python多版本环境安装与切换
  • Selenium之Web元素定位
  • Android笔试面试题AI答之Android基础(7)
  • hive-sql 连续登录五天的用户
  • 【GeekBand】C++设计模式笔记18_State_状态模式
  • 【2024年-6月-21日-开源社区openEuler实践记录】探索 intel-kernel:英特尔架构内核优化之路
  • [TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器
  • 环,域,体,整区,理想,极大理想,
  • 配置hive支持中文注释
  • Lombok是银弹?还是陷阱?
  • golang标准库archive/tar实现打包压缩及解压
  • 《Java核心技术 卷II》流的创建
  • Vue el-data-picker选中开始时间,结束时间自动加半小时
  • 滑动窗口、流量控制和拥塞控制
  • C++笔记-对windows平台上lib和dll的进一步理解(2024-10-21
  • YOLOv8实战车辆目标检测
  • js混淆中 p[‘name‘] 来访问属性的好处