首页 > 其他分享 >authenticate函数返回空值的异常情况处理,自创authenticate函数

authenticate函数返回空值的异常情况处理,自创authenticate函数

时间:2025-01-15 20:34:01浏览次数:3  
标签:authenticate 函数 自定义 auth 认证 空值 user password

主要分为两种情况

一、数据的密码加密问题

对于数据库表进行数据创建时使用model类进行正常数据创建,导致数据库表内密码为明文,但是authenticate()查找数据会自动加密,因此应该使用User.objects.create_user(username=username,password=password)进行数据创建。

二、数据查找异常

可能很多小伙伴都是在model里面创建一个类继承AbstractUser类进行数据迁移,然后创建数据也是往该表单内提交数据。因此,使用anthenticate()会导致查找不到数据。因为,该函数是默认查找auth_user表单,但是该表单没有存储数据因此一直返回none。

对待这个需要进行authenticate()函数的重写,使得它查找自己创建的数据库内的表单数据。同时,authenticate()函数也只能进行username和password的校验。因此,重构可以进行扩充自定义的校验。

是的,在 Django 中,`authenticate()` 函数默认是从 `auth_user` 表中获取数据进行认证。`auth_user` 表是由 Django 的 `auth` 应用中的 `User` 模型生成的,默认用于存储用户信息。

### `authenticate()` 函数的工作原理

1. **默认认证后端**:
   - `authenticate()` 函数使用 Django 的默认认证后端 `ModelBackend`,该后端从 `auth_user` 表中查询用户数据。
   - `ModelBackend` 会根据提供的 `username` 和 `password` 进行验证。如果用户名和密码匹配,并且用户是激活状态(`is_active` 为 `True`),则返回对应的 `User` 对象;否则返回 `None`。

2. **自定义认证后端**:
   - 如果你有自定义的认证需求,可以创建自定义认证后端,并在 `settings.py` 中配置 `AUTHENTICATION_BACKENDS`。
   - 自定义认证后端可以扩展或修改默认的认证逻辑,例如支持邮箱登录、多因素认证等。

### 示例:自定义认证后端

如果你需要支持邮箱登录,可以创建一个自定义认证后端:

在你的app下面创建一个py文件

# myapp/backends.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q
from myapp.models import User#导入你的类


class Identity(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(Q(username=username) | Q(password=password))#设置校验条件
            print("user的值{}",user)
            if user.check_password(password) and user.is_active:
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

在 `settings.py` 中配置自定义认证后端:

AUTHENTICATION_BACKENDS = [
    'myapp.authenticate函数.authenticates.Identity',#你自己定义的authenticate函数类的路径
#Identity为我的类名
    'django.contrib.auth.backends.ModelBackend',
]

使用自定义认证后端进行认证:

from django.contrib.auth import authenticate

username = 'admin@example.com'  # 可以是用户名或邮箱
password = '12341'

user = authenticate(username=username, password=password)

if user is not None:
    print("登录成功!")
else:
    print("登录失败,用户名或密码错误!")

### 总结

- **默认认证**:`authenticate()` 函数默认从 `auth_user` 表中获取数据进行认证。
- **自定义认证后端**:可以通过创建自定义认证后端来扩展或修改认证逻辑,支持更多认证方式。


 

标签:authenticate,函数,自定义,auth,认证,空值,user,password
From: https://blog.csdn.net/StankRottenFish/article/details/145096425

相关文章

  • 机器学习中的凸函数和梯度下降法
    一、凸函数在机器学习中,凸函数和凸优化是优化问题中的重要概念,许多机器学习算法的目标是优化一个凸函数。这些概念的核心思想围绕着优化问题的简化和求解效率。下面从简单直观的角度来解释。1.什么是凸函数?数学定义一个函数f(x)f(x)是凸函数,当且仅当它满足以下条件:......
  • 【c++】函数调用机制
    【c++】函数调用机制1.建立栈帧空间2.传递数据,为局部变量分配空间3.保护现场,主调函数运行状态和返回值地址入栈4.执行被调函数体5.释放局部变量的栈空间6.恢复现场,取主调函数运行状态和返回值地址7.继续执行主调函数后续语句详细介绍:ebpespeax等均是寄存器1.......
  • 【C语言】_字符串函数strcpy
    目录1. 函数声明及功能2.使用示例3.注意事项4. 模拟实现4.1第一版:基本功能+判空+const修饰4.2第二版:优化对于'\0'的单独拷贝4.3第三版:仿strcpy的char*返回值1. 函数声明及功能char*strcpy(char*destination,constchar*source); strcpy功能:字......
  • Effective C++ 之【条款7:为多态基类声明virtual析构函数】
    文章目录Tips1Tips2一、为什么要有virtual析构函数?二、为什么有时候不要声明虚构函数?三、使用一下纯虚函数。TodayThinking~Tips1polymorphic(带有多态性质的)baseclasses应该声明一个virtual的虚构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构......
  • OpenCV相机标定与3D重建(58)用于精细化优化由 cv::solvePnP 或 cv::solvePnPRansac 等
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述从3D-2D点对应关系出发,并基于一个初始解,精细化姿态(将物体坐标系中的3D点变换到相机坐标系的旋转和平移)。cv::solvePnPRefineVVS是OpenCV中用于精细化优化由cv::solvePnP或c......
  • OpenCV相机标定与3D重建(57)精细化优化由 cv::solvePnP 或 cv::solvePnPRansac 等函数
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述从3D-2D点对应关系出发,并基于一个初始解,精细化姿态(将物体坐标系中的3D点变换到相机坐标系的旋转和平移。cv::solvePnPRefineLM是OpenCV中用于精细化优化由cv::solvePnP或cv......
  • vue.js辅助函数-mapMutations
    在Vue.js中,使用辅助函数可以更方便地使用Vuex的mutation。而mapMutations就是Vuex提供的一个辅助函数,它可以将mutation映射到组件的methods中,使得我们可以在组件中直接调用mutation,而不需要手动进行commit。mapMutations函数接收一个字符串数组或对象作为参数,数组中的字符串即......
  • 6、原来可以这样理解C语言_函数(4/8)形参和实参
    目录 四、形参和实参四、(1)、实参 四、(2)、形参四、(3)、实参和形参的关系 四、形参和实参        在函数使⽤的过程中,把函数的参数分为,实参和形参。#include<stdio.h>intAdd(intx,inty){intz=0;z=x+y;returnz;}intmain(......
  • 2025.1.14初学欧拉函数记
    显然,本文的一切都是关于它——\(\varphi\)。前提互质若有正整数\(a,b\)且满足\(\gcd(a,b)=1\),则称\(a,b\)互质。对于多种数的情况,我们把\(\gcd(a,b,c)=1\)的情况称为\(a,b,c\)互质。把\(\gcd(a,b)=\gcd(a,c)=\gcd(b,c)=1\)称为\(a,b,c\)两两互质。后者明显是一个......
  • 智能合约中的多个函数重入攻击(Reentrancy Attack)详解
    简介在区块链智能合约开发中,重入攻击(ReentrancyAttack)是一种非常危险的漏洞类型。攻击者通过利用合约内函数之间的调用漏洞,可能会重复调用某个函数或多个函数,从而导致不正常的行为,甚至损失资金。通常,重入攻击依赖于合约执行过程中状态更新与外部合约交互的顺序错误。在这篇......