Django自己的认证方法只能认证用户名和密码

user = authenticate(**credentials)
# authenticate会自动校验用户名和密码

authenticate 源码

def authenticate(request=None, **credentials):
"""
If the given credentials are valid, return a User object.
"""
# _get_backends 是Django的配置文件中的AUTHENTICATION_BACKENDS 列表里面定义的认证方式
# 如果你自己项目的配置文件中配置了AUTHENTICATION_BACKENDS就会去你自己的配置文件中找
for backend, backend_path in _get_backends(return_tuples=True):
backend_signature = inspect.signature(backend.authenticate)
try:
backend_signature.bind(request, **credentials)
except TypeError:
continue
try:
# 每循环一个backend 都会去调用authenticate方法
# 如果你自己重写了authenticate方法 就会走你自己写的
user = backend.authenticate(request, **credentials)
except PermissionDenied:
break
if user is None:
continue
user.backend = backend_path
return user

如果自己没有配置AUTHENTICATION_BACKENDS

# 会从Django的配置文件中找
# from django.conf import global_settings AUTH_USER_MODEL = 'auth.User' AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']

导入django.contrib.auth.backends.ModelBackend

from django.contrib.auth.backends import ModelBackend

# 源码如下
class ModelBackend(BaseBackend):
"""
Authenticates against settings.AUTH_USER_MODEL.
"""
def authenticate(self, request, username=None, password=None, **kwargs):
if username is None:
username = kwargs.get(UserModel.USERNAME_FIELD)
if username is None or password is None:
return
try:
# 通过自然键(USERNAME_FIELD)获取 user 对象
user = UserModel._default_manager.get_by_natural_key(username)
except UserModel.DoesNotExist:
UserModel().set_password(password)
else:
# 检查密码和是否是活跃用户,然后返回一个 user 对象,否则什么也不返回 就是 None
if user.check_password(password) and self.user_can_authenticate(user):
return user

自定义Backend 实现简单的认证方式,如下:

因为Django自带的authenticate只能帮你验证用户名和密码,当你需要验证使用如手机号登录、邮箱登录、验证码登录等时,需要自己重写authenticate方法,自定义认证方式

from django.contrib.auth.backends import ModelBackend

# 继承ModelBackend重写里面的authenticate方法 自定义认证方式
class LoginBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
user = UserInfo.objects.get(Q(username=username) | Q(phone=username) | Q(email=username))
if user is not None and user.check_password(password):
return user

最后settings.py中需要配置

AUTHENTICATION_BACKENDS = [
'app01.backends.LoginBackend'
]
# 配置完之后再走校验的话就会先从你自己写的这个类里面去执行authenticate方法
# 会用你自己的校验方式

Django认证流程源码及自定义 Backend的更多相关文章

  1. Spring Security教程(八):用户认证流程源码详解

    本篇文章主要围绕下面几个问题来深入源码: 用户认证流程 认证结果如何在多个请求之间共享 获取认证用户信息 一.用户认证流程 上节中提到Spring Security核心就是一系列的过滤器链,当一个请求 ...

  2. SpringBoot + Spring Security 学习笔记(二)安全认证流程源码详解

    用户认证流程 UsernamePasswordAuthenticationFilter 我们直接来看UsernamePasswordAuthenticationFilter类, public clas ...

  3. shiro认证流程源码分析--练气初期

    写在前面 在上一篇文章当中,我们通过一个简单的例子,简单地认识了一下shiro.在这篇文章当中,我们将通过阅读源码的方式了解shiro的认证流程. 建议大家边读文章边动手调试代码,这样效果会更好. 认 ...

  4. 014 Security的认证流程源码级详解

    一:任务 1.任务 认证处理流程说明 认证结果如何在多个请求之间共享 获取认证用户信息 二:认证处理流程处理说明 1.流程图 这里只是一个登陆到登陆的认证部分的流程图. 2.流程解释 3.断点跟踪 页 ...

  5. Spark(四十九):Spark On YARN启动流程源码分析(一)

    引导: 该篇章主要讲解执行spark-submit.sh提交到将任务提交给Yarn阶段代码分析. spark-submit的入口函数 一般提交一个spark作业的方式采用spark-submit来提交 ...

  6. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  7. Spring加载流程源码分析03【refresh】

      前面两篇文章分析了super(this)和setConfigLocations(configLocations)的源代码,本文来分析下refresh的源码, Spring加载流程源码分析01[su ...

  8. Spring IOC容器启动流程源码解析(四)——初始化单实例bean阶段

    目录 1. 引言 2. 初始化bean的入口 3 尝试从当前容器及其父容器的缓存中获取bean 3.1 获取真正的beanName 3.2 尝试从当前容器的缓存中获取bean 3.3 从父容器中查找b ...

  9. Spark(五十一):Spark On YARN(Yarn-Cluster模式)启动流程源码分析(二)

    上篇<Spark(四十九):Spark On YARN启动流程源码分析(一)>我们讲到启动SparkContext初始化,ApplicationMaster启动资源中,讲解的内容明显不完整 ...

  10. SpringSecurity 初始化流程源码

    SpringSecurity 初始化流程源码 本篇主要讲解 SpringSecurity初始化流程的源码部分,包括核心的 springSecurityFilterChain 是如何创建的,以及在介绍哪 ...

随机推荐

  1. 【读书笔记】组合计数-Tilings-正文 学一半的笔记

    Tilings-正文部分 目录 9.2 转移函数方法 例子 补充 9.3 其余的方法 9.3.1 the path method 9.3.2 The permanent-determinant and ...

  2. vue3中watch的写法大合集。

    VUE2的watch是一个属性写法是 watch:{ data1(newVal,oldVal){ 同步/异步操作 } } VUE3的watch则是一个函数,写法是 注意数据必须是响应式的 let nu ...

  3. 多精度 simulator 中的 RL:一篇 14 年 ICRA 的古早论文

    目录 全文快读 0 abstract 1 intro 2 related work 3 背景 & 假设 3.1 RL & KWIK(know what it knows)的背景 3.2 ...

  4. 长达 1.7 万字的 explain 关键字指南!

    当你的数据里只有几千几万,那么 SQL 优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL 优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让 MySQL 查询语句又快又好是一件 ...

  5. [大数据]sqoop安装与运用

    1 文由 项目使用场景:OLTP Oracle 数据导入到 OLAP HIVE 2 Sqoop简述 Apache Sqoop(TM) 是一款开源的ETL工具,设计用于在 Apache Hadoop和结 ...

  6. Schillace法则:使用LLM创建软件的最佳实践

    LLM(大语言模型)的发展正在改变软件开发的方式. 以前,开发人员需要编写大量的代码来实现其意图,但现在,随着语言模型的发展,开发人员可以使用自然语言来表达他们的意图,而无需编写大量的代码.这使得软件 ...

  7. Http请求get与post请求方式的各种相关面试总结

    转载请注明出处: GET方法和POST方法是两种HTTP请求方法,GET方法通过URL传递参数,可以缓存,但参数长度有限,一般用于获取资源:POST方法通过表单传递参数,不能缓存,参数长度没有限制,一 ...

  8. 如何训练个人的ChatGpt4

    如何在自己的计算机上安装类似 ChatGPT 的个人 AI 并在没有互联网的情况下运行它 本文旨在为任何人安装此软件.最初它有一个视频,伴随着操作方法,但是事情变化很快,我的三次尝试只是推迟了我发表这 ...

  9. 火山引擎 DataTester:让企业“无代码”也能用起来的 A/B 实验平台

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当数字化变革方兴未艾,无代码正受到前所未有的关注.Salesforce 的数据显示,52%的 IT 部门表示,公司 ...

  10. 音视频通讯QoS技术及其演进

    利用多种算法和策略进行网络传输控制,最大限度满足弱网场景下的音视频用户体验. 良逸|技术作者 01 什么是QoS?音视频通讯QoS是哪一类? QoS(Quality of Service)是服务质量的 ...