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

我来详细讲解一下“Django Rest Framework实现身份认证源码详解”的完整攻略,下面我们将分为以下几个部分:

  1. 介绍Django Rest Framework身份认证的基本原理
  2. 详细讲解Django Rest Framework中使用基于Token的身份认证
  3. 详细讲解Django Rest Framework中使用基于Session的身份认证

1. Django Rest Framework身份认证的基本原理

在Django Rest Framework中实现身份认证,需要在视图函数中添加认证类,Django Rest Framework中提供基于Token和基于Session两种方式来实现身份认证。

在views.py中添加身份认证类的方法如下:

from rest_framework.authentication import TokenAuthentication

class ExampleView(APIView):
    authentication_classes = [TokenAuthentication]
    # your code here

上述代码中,我们导入了TokenAuthentication类,然后将ExampleView视图函数中的authentication_classes属性设置为[TokenAuthentication]即可使用基于Token的身份认证。

如果要使用基于Session的身份认证,只需将authentication_classes属性设置为[SessionAuthentication]即可。

2. Django Rest Framework中使用基于Token的身份认证

Django Rest Framework中的Token身份认证是一种轻量级的身份认证方式,它的原理是:当用户首次登录,服务端会生成一个Token并返回给客户端,这个Token作为客户端请求时的身份凭证,服务端根据这个Token来识别用户的身份。

下面我们来看一下如何在Django Rest Framework中使用基于Token的身份验证。

2.1 生成Token

在Django Rest Framework中生成Token有两种方式:使用rest_framework.authtoken库和使用Django自带的TokenAuthentication库。这里我们采用使用Django自带的TokenAuthentication库的方式来生成Token。

在使用基于Token的身份认证前,我们需要先给用户生成一个Token,生成Token的方法如下:

from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token

user = User.objects.get(username='username')
token = Token.objects.create(user=user)

在上面的代码中,我们首先通过User.objects.get()方法获取到某个用户,然后使用Token.objects.create()方法为该用户生成一个Token。生成的Token将保存在数据库中的authtoken_token表中,每个Token对应一条记录,记录中保存了Token的值和对应的用户。

2.2 配置Token认证

我们已经生成了Token,接下来,我们需要在Django Rest Framework中配置Token认证。

from rest_framework.authentication import TokenAuthentication

class ExampleView(APIView):
    authentication_classes = [TokenAuthentication]

    def get(self, request, *args, **kwargs):
        # your code here
        pass

在上面的代码中,我们导入TokenAuthentication类,并将认证方式设置为基于Token的认证,然后在视图函数ExampleViewget方法中就可以通过request.user来获取当前已经认证的用户。

此时,我们就可以在客户端中将Token值放入请求头中进行请求:

headers = {'Authorization': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'}
response = requests.get('http://localhost:8000/api/endpoint/', headers=headers)

在上面的代码中,我们在请求头中添加了Authorization字段,并将Token值放入其中。在服务端中,Django Rest Framework会自动解析请求头中的Token并进行身份认证。

2.3 自定义Token模型

Django Rest Framework中提供的Token模型较为简单,如果我们需要在Token模型中添加一些自定义的字段,需要自定义Token模型。

自定义Token模型的方法如下:

  • 首先,在models.py中创建一个自定义的Token模型,在Token模型中添加一些自定义的字段。
from django.contrib.auth.models import AbstractUser, User
from django.db import models
from rest_framework.authtoken.models import Token

class CustomToken(Token):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='用户', related_name='auth_tokens')
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    class Meta:
        ordering = ['-created_time']
        verbose_name = '自定义Token'
        verbose_name_plural = '自定义Token'

在上面的代码中,我们从rest_framework.authtoken.models import Token中导入原生的Token类,并自定义了一个CustomToken模型,在CustomToken模型中添加了一个created_time字段,并将user字段设置为外键。

  • 然后,我们需要修改Django Rest Framework中的Token认证类,将它的token_model属性设置为我们自定义的Token模型。修改认证类的方法如下:
from rest_framework.authentication import TokenAuthentication
from myapp.models import CustomToken

class CustomTokenAuthentication(TokenAuthentication):
    model = CustomToken

在上面的代码中,我们定义了一个自定义的Token认证类,将model属性设置为我们自定义的Token模型。

  • 最后,在视图函数中使用我们自定义的Token认证类即可。
class ExampleView(APIView):
    authentication_classes = [CustomTokenAuthentication]

    def get(self, request, *args, **kwargs):
        # your code here
        pass

在上面的代码中,我们将ExampleView视图函数中的身份认证方式设置为基于自定义Token的认证方式。

3. Django Rest Framework中使用基于Session的身份认证

Django Rest Framework中的Session身份认证是一种通过使用浏览器的Cookie来实现的身份认证方式。

下面我们来看一下如何在Django Rest Framework中使用基于Session的身份认证。

3.1 配置Session认证

在Django Rest Framework中使用Session身份认证的方式与使用Token身份认证稍有不同,我们需要先在Django中开启Session,并在Django Rest Framework中进行相关配置。

  • 首先,需要在Django中配置Session,可以在settings.py中进行配置,代码如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.db'       # session存储方式
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                       # 浏览器关闭时session是否过期
SESSION_COOKIE_HTTPONLY = True                                # session cookie只能通过HTTP请求来获取,JS无法获取
SESSION_COOKIE_SECURE = False                                 # 是否启用HTTPS安全传输协议

在上面代码中,我们使用Django自带的Session存储方式,设置Session在浏览器关闭时不过期,设置Session cookie只能通过HTTP请求来获取,设置Session cookie不启用HTTPS安全传输协议。

  • 然后,在视图函数中添加Session认证:
from rest_framework.authentication import SessionAuthentication

class ExampleView(APIView):
    authentication_classes = [SessionAuthentication]

    def get(self, request, *args, **kwargs):
        # your code here
        pass

在上面的代码中,我们导入了Django Rest Framework中的SessionAuthentication认证类,并将ExampleView视图函数中的身份认证方式设置为基于Session的认证方式。

3.2 在客户端中使用Session认证

在客户端中使用Session认证的方式与使用Token认证略微不同,需要使用Django自带的django.contrib.sessions.backends.base.SessionBase类来模拟Session认证。

import requests
from django.contrib.sessions.backends.base import SessionBase

session = SessionBase()
session['_auth_user_id'] = '1'   # 用户ID
session['_auth_user_backend'] = 'django.contrib.auth.backends.ModelBackend'

headers = {'Cookie': 'sessionid={}'.format(session.session_key)}
response = requests.get('http://localhost:8000/api/endpoint/', headers=headers)

在上面的代码中,我们首先导入了django.contrib.sessions.backends.base.SessionBase类,然后模拟Session认证,将用户ID和用户认证后端保存到Session中,最后在请求头中添加sessionid即可。

这样,我们就可以在客户端中使用Session认证对Django Rest Framework进行身份认证了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django Rest Framework实现身份认证源码详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Django 框架篇(十): django自带的认证系统

    目录 auth模块 authenticate()    login(HttpRequest, user) logout(request)  is_authenticated() login_requierd() create_user() create_superuser() check_password(password) set_password(pas…

    Django 2023年4月13日
    00
  • Django项目如何正确配置日志(logging)

    配置日志(logging)是Django项目创建的过程中非常重要的一步。它可以帮助我们更好地监控应用的行为和性能,从而更快地发现问题并解决它们。下面是一个步骤: 第一步:安装依赖 在创建Django项目之前,请确保你已经安装了Python logging模块。你可以使用pip命令安装依赖: pip install logging 第二步:创建日志记录器 在D…

    Django 2023年5月16日
    00
  • Django结合Websocket进行WebSSH的实现

    什么是webssh?   泛指一种技术可以在网页上实现一个 终端。从而无需 之类的模拟终端工具进行 连接,将 这一比较低层的操作也从 架构扭成了 架构 这样的架构常用在运维制作开发一些堡垒机等系统中,或是目前比较新型的在线教育方式,通过向学生提供一个可以直接使用浏览器进行相关 操作或代码编写的学习方式 主要是建立客户端与服务端的即时通信 模型 此种 实现方式…

    Django 2023年4月13日
    00
  • Django(2) – Django模板

    1.Django模板介绍 基础概念 模板是具有一定的格式或骨架,可以动态的生成HTML 模板引擎决定以何种方式组织代码 一个项目可以有一个或者是多个模板引擎,Django里面主要两个模板引擎:DTL、Jinja2。 Jinja2之前Flask笔记里面有,点击跳转https://www.cnblogs.com/gltou/p/16828437.html   D…

    Django 2023年4月13日
    00
  • Django——XSS攻击及处理

    XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。 这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。 攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内…

    Django 2023年4月15日
    00
  • Django中blank和NULL

    当我们在django中添加一个数据库字段时,我们通常会写models.CharField(max_length = 100,null = True,blank = True)。用ForeignKey,DecimalField做同样的事情。有什么基本的区别在于 null = True only blank = True only null = True,bla…

    Django 2023年4月11日
    00
  • django 修改 request 对象中的请求参数, 并重新赋值给 request 对象

    直接上代码, 实现流程看代码及注释 def your_view(self, request): method = request.method if method == “GET”: # 使用 querydict对象的copy()方法, 获取一个可修改的querydict data = request.GET.copy() # 修改参数值 data = pa…

    Django 2023年4月9日
    00
  • Django之Auth模块 实现登录,退出,自带session 与认证功能的一个重要的模块

    Auth模板 1. 什么是Auth模块,有什么用? django的auth的模块的使用: auth 是集合注册,登录,注销,session 多个功能集合在一起的模块 2. 使用Auth组件的默认auth_user表常用操作 from django.contrib.auth.models import User # 1、创建普通用户 User.objects.…

    Django 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部