Django认证流程源码及自定义 Backend

这篇具有很好参考价值的文章主要介绍了Django认证流程源码及自定义 Backend。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 对象
            # 本质还是通过UserInfo.object.filter(username=username)
            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方法,自定义认证方式文章来源地址https://www.toymoban.com/news/detail-465804.html

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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring Security认证流程分析

    Spring Security认证流程分析

    先分别实现 userdetailsService,userDetails,passwordEncoder三个接口, 然后就是写登录逻辑 本文章用的是继承UsernamePasswordAuthenticationFilter这个接口 因为这个框架默认登录逻辑是在这里面的,里面的核心就是通过 这里这个接口可以不用写过滤器里,可以直接写在serviceImpl里面的登录逻

    2024年04月28日
    浏览(9)
  • Kerberos认证流程及基本操作

    Kerberos认证流程及基本操作

    Kerberos主要是有三个重要的角色: 1、访问服务的Client 2、提供服务的Server 3、KDC(Key Distribution Center)密钥分发中心,其中报错AS(authorization server)和TGS(ticket granting server)   上图 AD其实类似于一个本机的一个数据库,存储所有client的白名单。 根据上图我们梳理胰腺癌Kerb

    2024年02月11日
    浏览(15)
  • EMQ X如何生成认证信息?身份认证流程和操作步骤

    EMQ X如何生成认证信息?身份认证流程和操作步骤

    身份认证是大多数应用的重要组成部分,EMQ X 中的认证指的是当一个客户端连接到 EMQ X 的时候,通过服务器端的配置来控制客户端连接服务器的权限。 EMQ X 的认证支持包括两个层面: • MQTT 协议本身在 CONNECT 报文中指定用户名和密码,EMQ X 以插件形式支持基于 Username、 Cl

    2024年02月11日
    浏览(8)
  • 多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程

    多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程

    对用户表扩展手机号码字段,允许用户通过手机号码与验证码的方式进行认证,注册,重置密码以及更换手机号。 多因素身份认证 (MFA) 是保护企业 IT 资源访问安全的一种关键工具,也是零信任安全模型的核心组成。特别在远程办公以及数据泄露事件层出不穷的背景下,越来

    2024年02月09日
    浏览(37)
  • spring security认证授权流程

    认证和授权是任何安全体系中的两个主要功能,而在现代Web开发中,Spring Security是最受欢迎和广泛使用的安全框架之一。在本篇文章中,我们将全面介绍Spring Security的认证和授权机制,并提供详细的步骤和示例代码。  一、认证(Authentication) 认证的主要目的是验证用户的身

    2024年02月15日
    浏览(11)
  • SpringSecurity认证和授权流程详解

    SpringSecurity认证和授权流程详解

    Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。它支持多种身份验证选项和授权策略,开发人员可以根据需

    2024年04月08日
    浏览(14)
  • ITSS认证流程,ITSS应该怎么办理

    ITSS认证 流程, ITSS 应该怎么办理 一、什么是ITSS ITSS(Information Technology Service Standards 信息技术服务标准,简称ITSS)是国内第一套成体系和综合配套的信息技术服务标准库,全面规范了IT服务产品及其组成要素,用于指导实施标准化和可信赖的IT服务。  ITSS的内容即主要包括一系

    2024年02月11日
    浏览(9)
  • nestjs之JWT认证实现流程

    nestjs之JWT认证实现流程

    nestjs的jwt认证利用了 Passport.js 的认证机制。要根据这个源码实现您自己的 AuthGuard,需要理解几个关键部分:如何集成 Passport.js、如何处理认证结果,以及如何使用 NestJS 的依赖注入系统。 先自定义一个策略函数类 PassportStrategy 函数返回的是 MixinStrategy 类,该类提供 callback 去

    2024年01月17日
    浏览(11)
  • Java【算法 04】HTTP的认证方式之DIGEST认证详细流程说明及举例

    Java【算法 04】HTTP的认证方式之DIGEST认证详细流程说明及举例

    详细的说明文档:WWW-Authenticate - HTTP | MDN (mozilla.org) 摘要认证(Digest Authentication)是一种用于在网络通信中验证用户身份的认证方法。它主要应用于HTTP和其他应用层协议中。 Digest认证相对于基本认证更加安全,因为它不直接传输明文密码。但它也不是完全的安全解决方案,因

    2024年02月13日
    浏览(13)
  • HTTPS的认证和加密流程,超详细!!

    HTTPS的认证和加密流程,超详细!!

    1、服务器生成自己的 私钥A 和 公钥A 2、服务器将 公钥A 和服务器域名等相关信息,发送给认证机构 3、认证机构生成自己的 私钥B 和 公钥B ,并用自己的 私钥B 对服务器发送来的信息进行加密, 生成服务器A的证书 ,发送给服务器 4、认证机构将自己的 公钥B 发给的浏览器

    2024年02月13日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包