Django多字段认证的实现

Django多字段认证

需求:

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

重写:

ModelBackend 类下的 authenticate 方法

python 复制代码
# 在对应应用下创建 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
python 复制代码
# setting.py

""" 修改django认证后端类 """
# django认证的检查用户是username, 默认是 django.contrib.auth.backends.ModelBackend
# AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"]
# 修改为自定义的用户验证类, 它也继承了 ModelBackend, 导包
AUTHENTICATION_BACKENDS = ['users.utils.UsernameModelAuthBackend']
相关推荐
DanCheng-studio6 小时前
网安毕业设计简单的方向答疑
python·毕业设计·毕设
轻抚酸~6 小时前
KNN(K近邻算法)-python实现
python·算法·近邻算法
独行soc8 小时前
2025年渗透测试面试题总结-264(题目+回答)
网络·python·安全·web安全·网络安全·渗透测试·安全狮
汤姆yu8 小时前
基于python的外卖配送及数据分析系统
开发语言·python·外卖分析
如何原谅奋力过但无声9 小时前
TensorFlow 1.x常用函数总结(持续更新)
人工智能·python·tensorflow
翔云 OCR API9 小时前
人脸识别API开发者对接代码示例
开发语言·人工智能·python·计算机视觉·ocr
AndrewHZ10 小时前
【图像处理基石】如何在图像中提取出基本形状,比如圆形,椭圆,方形等等?
图像处理·python·算法·计算机视觉·cv·形状提取
温轻舟11 小时前
Python自动办公工具05-Word表中相同内容的单元格自动合并
开发语言·python·word·自动化办公·温轻舟
习习.y12 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
撸码猿12 小时前
《Python AI入门》第10章 拥抱AIGC——OpenAI API调用与Prompt工程实战
人工智能·python·aigc