django authenticate--用户身份认证

这篇具有很好参考价值的文章主要介绍了django authenticate--用户身份认证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

authenticate
Django的contrib.auth模块中的authenticate()函数用于对用户的凭据进行身份验证,与已配置的身份验证后端进行比较。

当用户尝试登录时,authenticate()函数将使用用户的凭据(即用户名和密码)作为参数进行调用,该函数然后检查可用的身份验证后端以验证凭据,这些后端在项目的settings.py文件中定义,如果凭据有效,则authenticate()函数返回已认证的用户对象;否则,它返回None。
在成功身份验证后,可以使用Django的login()函数登录用户。

认证后端
1.AUTHENTICATION_BACKENDS是Django设置中的一个参数,它定义了用于身份验证的后端认证方式。这个参数是一个字符串列表,包含Django认证系统使用的认证后端类的全名。

2.当用户尝试进行身份验证时,Django将按照AUTHENTICATION_BACKENDS中定义的顺序,尝试每个后端认证方式,直到找到一个认证方式成功为止。如果所有后端认证方式都失败,则身份验证失败。

3.默认情况下,Django使用ModelBackend作为身份验证后端,它基于Django中的用户模型进行身份验证。除此之外,Django还提供了其他的身份验证后端,如LDAPBackend、RemoteUserBackend等,也可以自定义身份验证后端。

4.通过配置AUTHENTICATION_BACKENDS参数,可以对身份验证后端进行定制,以满足具体项目的需求。例如,如果你的项目需要使用LDAP进行用户身份验证,则可以添加LDAPBackend到AUTHENTICATION_BACKENDS列表中,以便Django使用LDAPBackend进行身份验证。

from django.contrib.auth import authenticate
from django.contrib.auth import login as user_login
def my_login(request):
    """
    登录视图
    :param request:
    :return:
    """
    if request.method == "POST":
        login_form = users_form.UserForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data['username']
            password = login_form.cleaned_data['password']
            myuser = authenticate(username=username, password=password)
            if myuser is not None:
                user_login(request, myuser)

这段代码使用Django的contrib.auth模块来进行用户身份验证和登录。
首先,它调用authenticate()函数验证用户的凭据,如果凭据有效,则authenticate()函数将返回已认证的用户对象,并将其赋给myuser变量。如果凭据无效,则authenticate()函数将返回None。
接着,代码检查myuser变量是否为None。如果myuser不为None,则说明凭据有效,并且代码将调用user_login()函数来将该用户登录到当前会话中。user_login()函数需要传递一个request对象和已认证的用户对象。登录成功后,用户可以访问需要认证的页面和视图。
如果myuser为None,则说明凭据无效,用户无法登录。

myuser 和 request.user 是两个不同的对象,其区别在于:
1.myuser 表示通过用户名和密码认证成功后得到的用户对象, 是通过表单验证之后从数据库中查询出来的用户对象,即 authenticate 方法返回的对象。主要用来检查用户输入的用户名和密码是否正确,并在认证成功后设置一些 session 变量。
2.request.user 表示当前请求的用户对象,是通过 Django 的认证系统得到的用户对象,包括通过认证的用户和未认证的用户。如果用户已通过认证,则该对象是一个 User 实例,否则是一个 AnonymousUser 实例。 主要用来获取当前认证的用户信息,例如用户的用户名、邮箱等。这些信息通常用来显示在页面上,或者用来判断当前用户是否有权限进行某些操作。

因此,在这个方法中,myuser 和 request.user 作用是相同的,都是用来判断用户是否已通过认证,但是可能是不同的对象,因为 myuser 只在用户认证成功后才会有值,而 request.user 则是在每个请求中都会有值,不论用户是否通过认证。同时,在这个方法中,myuser 和 request.user 都可以用来检查用户是否已通过认证,但是只有 request.user 才可以用来获取当前认证的用户信息。

authenticate函数如下:


@sensitive_variables("credentials")
def authenticate(request=None, **credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backends(return_tuples=True):
        backend_signature = inspect.signature(backend.authenticate)
        try:
            backend_signature.bind(request, **credentials)
        except TypeError:
            # This backend doesn't accept these credentials as arguments. Try
            # the next one.
            continue
        try:
            user = backend.authenticate(request, **credentials)
        except PermissionDenied:
            # This backend says to stop in our tracks - this user should not be
            # allowed in at all.
            break
        if user is None:
            continue
        # Annotate the user object with the path of the backend.
        user.backend = backend_path
        return user

_get_backends会从settings.py中读取AUTHENTICATION_BACKENDS定义的后端路径:

def _get_backends(return_tuples=False):
    backends = []
    for backend_path in settings.AUTHENTICATION_BACKENDS:
        backend = load_backend(backend_path)
        backends.append((backend, backend_path) if return_tuples else backend)
    if not backends:
        raise ImproperlyConfigured(
            "No authentication backends have been defined. Does "
            "AUTHENTICATION_BACKENDS contain anything?"
        )
    return backends
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'backends.user_backend.UserBackend'
]

AUTHENTICATION_BACKENDS列表中包含了两个认证后端,分别是ModelBackend和UserBackend。Django将按照列表中的顺序依次尝试这两个认证后端,直到找到一个成功为止。

UserBackend需要继承BaseBackend并实现一个authenticate函数:文章来源地址https://www.toymoban.com/news/detail-449322.html

from django.contrib.auth.backends import BaseBackend
from users.models import MyUser


class UserBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            myuser = MyUser.objects.get(name=username)
            if myuser.check_password(password):
                return myuser
        except MyUser.DoesNotExist as e:
            print("user no exist", e)
            return None

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

到了这里,关于django authenticate--用户身份认证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 计算机网络的故事——确认访问用户身份的认证

    HTTP使用的认证方式:BASIC认证(基本认证)、DIGEST(摘要认证)、SSL客户端认证、FormBase认证(基于表单认证)。 基于表单的认证:涉及到session管理以及cookie的应用。

    2024年02月09日
    浏览(47)
  • 3-2. SpringBoot项目集成【用户身份认证】实战 【实战核心篇】基于JWT生成和校验Token

    书接上文 技术选型篇,我们做了【用户身份认证】的技术选型说明,对基于 Session、Token、JWT 的方案进行了详细的对比分析,详细说明了它们都是什么和各自的优缺点!这些是实战的基础,还没看过的同学,建议先看上文。最终采用的是目前流行的 基于JWT的Token用户身份认证

    2023年04月08日
    浏览(51)
  • 3-1. SpringBoot项目集成【用户身份认证】实战 【技术选型篇】基于Session、Token、JWT怎么选?

    通过第二章2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包,我们实现了基于SpringBoot项目的 API接口开发 ,并实现 API结果统一封装、支持跨域请求 等等功能,接下来开始第三章,主要做用户身份认证,主要实现一套 统一鉴权的用户身份认证的机制 。 我已经提

    2024年01月22日
    浏览(55)
  • 3-3. SpringBoot项目集成【用户身份认证】实战 【全流程篇】基于JWT+双重检查的登录+登出+拦截器

    书接上文 实战核心篇,我们已经 把JWT的核心代码实现了! 文中不止是代码实现,更是使用到了设计原则,提升大家的内功心法。并且抛转引玉的实现了RSA和HMAC两种算法,还没看过的同学,建议先看上文。所以对于 基于JWT的Token用户身份认证机制 来说,剩下的就是与接口结

    2023年04月16日
    浏览(50)
  • 统一身份认证,构建数字时代的安全壁垒——统一身份认证介绍、原理和实现方法

    随着数字化时代的来临,个人和机构在互联网上的活动越来越频繁,对于身份认证的需求也愈发迫切。为了有效应对身份欺诈、数据泄露等问题,统一身份认证(Unified Identity Authentication)应运而生。 在本文博主将介绍统一身份认证的概念、原理以及其具体的实现方案。 统一

    2024年02月03日
    浏览(45)
  • 身份认证——802.1x认证和MAC认证讲解

    目录 802.1x基础 EAP(Extensible Authentication Protocol)可扩展认证协议 EAPoL(EAP over LAN)局域网可扩展认证协议 802.1x体系架构 受控端口的受控方式 802.1x认证 802.1x认证触发方式 客户端退出认证 802.1x认证方式 MAC认证 802.1x认证又称为EAPOE(Extensible Authentication Protocol Over Ethernet)认证

    2024年02月03日
    浏览(43)
  • 【认证绕过】NACOS身份认证绕过漏洞分析

    前言 工作中遇到一个nacos服务认证绕过的问题,在此总结一下漏洞原因。 官方文档描述: Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、

    2023年04月13日
    浏览(52)
  • 常见的身份认证技术

    (1)   口令认证技术(用户名/密码) 这是最简单也是最传统的身份认证方法,通过口令来验证用户的合法有效性。 通过用户名  ID  和用户密码  PW  来认证用户。 只要能够正确验证密码,系统就判定操作者是合法用户。 口令认证主要适用于小型封闭型系统。 存在的问题

    2024年02月06日
    浏览(54)
  • NACOS身份认证绕过

    一、漏洞描述 Nacos是Alibaba的一个动态服务发现、配置和服务管理平台。攻击者通过添加Nacos-Server的User-Agent头部将可绕过(nacos.core.auth.enabled=true)鉴权认证,从而进行API操作。 二、漏洞利用 访问 http://xxxxx/nacos/v1/auth/users?username=testpassword=test ,并使用burpsuite进行抓包,将方法

    2024年02月16日
    浏览(46)
  • ES开启身份认证

    X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 X-Pack的发展演变: 1,5.X版本之前:没有x-pack,是独立的:security安全,watch查看,alert警告等独立单元。 2,5.X版本:对原本的安全,警告,监视,图形和报告做了一个封装,形成了x-pac

    2024年02月14日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包