Django Auth应用实现用户身份认证

目录
  • 1. 实现用户的认证
    • 用户认证过程解析
    • Django获取后端认证
  • 2. Auth应用获取用户模型

我们知道 Django Auth 应用一般用在用户的登录注册上,用于判断当前的用户是否合法,从而可以帮助开发者快速的构建用户系统,那么 Auth 应用又是如何是实现用户的认证的呢?当给定相关的条件或属性时候,我们可以去获取用户对象这个过程就被称为用户认证,Django Auth 应用提供了一个用来认证的方法即 authenticate 方法用来实现用户的认证行为。下面就让我们一起来认识一下吧!

1. 实现用户的认证

authenticate 方法一般接受 username 与 password 作为参数,如果通过了认证,就返回认证的实例对象,否则就会返回 None,下面我们进行一下相关的实例演示:

In [1]: from django.contrib.auth import authenticate

In [2]: user=authenticate(username="bookstore",password="python_django")

In [3]: user

Out[3]: <User: bookstore>

In [4]: user=authenticate(username="bookstore",password="python")

In [5]: user is None

Out[5]: True

用户认证过程解析

上述代码中,我们首先引入 authenticate ,可知该方法定义在 django/contrib/auth/__init__.py 文件中,然后我们对上一节中创建的 user 用户进行可认证,输入它的两个参数值,最后验证通过返回了 user 的实例对象,最后我们更改了密码的参数值将其设置为不正确,并使用 user is None 的方法查看其返回结果是否为 None,得到的布尔值为 Ture,所以用户认证失败。这就是用户认证的的过程。

那么 authenticate 方法是如何实现的呢?我们分析一下它的源码:

def authenticate(request=None, **credentials):
    #__get_backends获取当前系统中定义的认证后端,并依次迭代
    for backend, backend_path in _get_backends(return_tuples=True):
        try:
            inspect.getcallargs(backend.authenticate, request, **credentials)
        except TypeError:
            #此后端不接受这些凭据作为参数。返回继续执行循环
            continue
        try:
             #通过当前的认证后端尝试获取 User,若获取不到就会抛出异常!
            user = backend.authenticate(request, **credentials)
        except PermissionDenied:
            #抛出异常Permission
            break
         #如果没有返回,继续执行下一个认证
        if user is None:
            continue
        #添加一个属性标志,代表后端认证成功
        user.backend = backend_path
        return user
    # 所提供的凭据对所有后端、触发信号无效
    user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)

Django获取后端认证

上述代码中,我们可以看出,authenticate 方法使用了当前系统中定义的认证后端来获取用户对象,当前系统的默认认证后端是 ModelBackend。那么 Django 是如何获取认证后端的呢?如下所示:

def _get_backends(return_tuples=False):
    backends = []
    #AUTHENTICATION_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 框架默认的后端认认证,它位于 django/conf/global_settings.py 文件中,如下所示:

AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend']  #当前系统默认认证后端ModelBackend

AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend']  #当前系统默认认证后端ModelBackend

2. Auth应用获取用户模型

get_user_model 用于获取当前系统定义的“用户模型”。其源代码如下所示:

def get_user_model():
    """
    返回一个处于激活状态的 User
    """
    try:
        return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
    except ValueError:
        raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
    except LookupError:
        raise ImproperlyConfigured(
            "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
        )

get_user_model 使用实例如下所示:

# 使用默认User model时
>>> from django.contrib.auth import get_user_model
>>> get_user_model()
<class 'django.contrib.auth.models.User'>
# 使用自定义User model时
>>> from django.contrib.auth import get_user_model
>>> get_user_model()
<class 'xxx.models.NewUser'>
# get_user_model()实际获取的是settings.AUTH_USER_MODEL指定的User model

Django 允许在 settings.py 文件中定义 AUTH_USER_MODEL 覆盖默认的 auth.User,以满足特定项目的需求。所以,ModelBacakend 的 authenticate 方法首先会通过 username 尝试获取 User 对象,再去校验密码是否正确以及 is_active 的状态,最后返回 User 对象或是返回 None。在  settings.py 配置 AUTH_USER_MODEL 格式如下所示:

#格式: "<django_app名>.<model名>"
AUTH_USER_MODEL = "appname.NewUser"
#在models.py编写示例
from django.conf import settings
from django.db import models
class Article(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=100)

在 django/contrib/auth/__init__.py 文件中定义了用户的各种行为,例如,登录、退出、用户的认证等等,通过这些可见 Django 的强大所在,Auth 应用模块可以帮助开发者减少很多的工作量,而且 Auth 应用的源码可以给开发者提供诸多的用户系统重写思路。 

到此这篇关于Django Auth应用实现用户身份认证的文章就介绍到这了,更多相关Django Auth应用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Django之auth模块(用户认证)

    auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的登录信息是否存在于数据库中. 除此之外,auth还对session做了一些封装,方便我们校验用户是否已登录 auth里的方法 如果想使用auth模块的方法,必须要先导入auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法

  • Django 用户认证Auth组件的使用

    Django 用户认证(Auth)组件 Django 用户认证(Auth)组件一般用在用户的登录注册上,用于判断当前的用户是否合法,并跳转到登陆成功或失败页面. Django 用户认证(Auth)组件需要导入 auth 模块: # 认证模块 from django.contrib import auth # 对应数据库 from django.contrib.auth.models import User 返回值是用户对象. 创建用户对象的三种方法: create():创建一个普通用户,密码是明

  • Django Auth用户认证组件实现代码

    用户认证组件: 功能:用session记录登录验证状态 前提:用户表:django自带的auth-user python3 manage.py createsuperuser #创建超级用户 补充匿名用户: API: from django.contrib import auth : 1. #if 验证成功返回user对象,否则返回None user = auth.authenticate(username=user,password=pwd) 2. auth.login(request,use

  • Django Auth应用实现用户身份认证

    目录 1. 实现用户的认证 用户认证过程解析 Django获取后端认证 2. Auth应用获取用户模型 我们知道 Django Auth 应用一般用在用户的登录注册上,用于判断当前的用户是否合法,从而可以帮助开发者快速的构建用户系统,那么 Auth 应用又是如何是实现用户的认证的呢?当给定相关的条件或属性时候,我们可以去获取用户对象这个过程就被称为用户认证,Django Auth 应用提供了一个用来认证的方法即 authenticate 方法用来实现用户的认证行为.下面就让我们一起来认识一下吧!

  • PHP中对用户身份认证实现两种方法

    当访问者浏览受保护页面时,客户端浏览器会弹出对话窗口要求用户输入用户名和密码,对用户的身份进行验证,以决定用户是否有权访问页面.下面用两种方法来说明其实现原理. 一.用HTTP标头来实现 标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串.HTTP采用一种挑战/响应模式对试图进入受密码保护区域的用户进行身份验证.具体来说,当用户首次向WEB服务器发出访问受保护区域的请求时,挑战进程被启动,服务器返回特殊的401标头,表明该用户身份未经验证.客户端浏览器在检测到上述响应之后自动弹出对

  • django rest framework 实现用户登录认证详解

    1.安装 pip install djangorestframework 2.创建项目及应用 创建项目 创建应用 目录结构如图 3.设置settings.py 设置数据库连接 # MySQL 增加mysql 连接 DATABASES = { 'default':{ 'ENGINE':'django.db.backends.mysql', 'HOST':'127.0.0.1', 'PORT':'3306', 'NAME':'dbname', # 数据库名 'USER':'username', 'P

  • Django自定义用户登录认证示例代码

    前言 有时候 Django 自带的用户登录认证不能满足我们的需求,比如我不想要用户名+密码登录,我想手机号+验证码登录,这样就需要我们去修改 Django 自带的认证了. Django 默认使用用户认证的是ModelBackend,这个类也就是我们要下手的地方,ModelBackend里面有一个authenticate的方法,这个方法就是登录时对用户认证的方法.我们要改的就是这个方法. 先看看原码理解一下认证逻辑: 第15-16行先获取认证用的用户名字段,默认是username,如果在Userm

  • 基于SpringBoot实现用户身份验证工具

    session失效时间 在Tomcat上,session的默认有效时间是30分钟.也可以通过配置文件修改session的有效时间. 1)修改web.xml <!-- 设置session失效,单位分 --> <session-config> <session-timeout>1</session-timeout> </session-config> 2).yml文件 server.session.cookie.http-only= #是否开启Htt

  • Django中的用户身份验证示例详解

    前言 这次开发微信抢票程序中,普通用户的身份是由微信管理的.当用户通过微信公众号(测试号)向后台发消息时,微信会将用户的身份标记为一个unique_id来识别,后端可以由此来判断用户身份.这种认证比较特殊,它不存在登陆.登出的操作.如果是一个普通的web应用,应该有用户的登陆.登出操作,当用户未经授权访问某个URL的时候,后端应该拒绝这次请求,或者是重定向到登陆界面. 在这次作业中,因为需要一个后台管理员来管理各种活动的创建和发布,因此也需要有用户的身份认证操作.这次的后端是Django,试了一

  • Django用户身份验证完成示例代码

    在这篇Django文章中,wom 将讨论Django User 验证,Django附带了一个用户认证系统. 它处理用户帐户,组,权限和基于cookie的用户会话. Django身份验证系统同时处理身份验证和授权. 简要地说,身份验证将验证用户是他们声称的身份,而授权则确定允许经过身份验证的用户执行的操作. 基本上,我们将创建登录,注销,忘记密码和重置密码功能. 身份验证支持在django.contrib.auth中为Django contrib模块.默认情况下,所需的配置已包含在django-a

  • Django Rest Framework实现身份认证源码详解

    目录 一.Django框架 二.身份认证的两种实现方式: 三.身份认证源码解析流程 一.Django框架 Django确实是一个很强大,用起来很爽的一个框架,在Rest Framework中已经将身份认证全都封装好了,用的时候直接导入authentication.py这个模块就好了.这个模块中5个认证类.但是我们在开发中很少用自带的认证类,而是根据项目实际需要去自己实现认证类.下面是内置的认证类 BaseAuthentication(object):所有的认证相关的类都继承自这个类,我们写的认证

  • MongoDB安全及身份认证(实例讲解)

    前面的话 本文将详细介绍MongoDB安全相关的内容 概述 MongoDB安全主要包括以下4个方面 1.物理隔离 系统不论设计的多么完善,在实施过程中,总会存在一些漏洞.如果能够把不安全的使用方与MongoDB数据库做物理上的隔离,即通过任何手段都不能连接到数据库,这是最安全的防护.但,通常这是不现实的.一些重要的数据可能会保存下来,放置到物理隔离的机房中 2.网络隔离 许多公司的开发机处于内网环境中.即使数据库存在漏洞,外部环境也没有机会利用,因为根本无法访问内网 3.防火墙隔离 可以利用防火

随机推荐