首页 > 其他分享 >Django用户权限通过Token校验

Django用户权限通过Token校验

时间:2023-03-28 14:44:35浏览次数:35  
标签:__ 缓存 get 验证 request 校验 Django Token

最好是将用户权限验证和Token验证放在Django中间件中,以便对所有视图函数进行校验。
下面是一段示例代码,演示了如何实现中间件来进行用户权限验证和Token验证

middleware.py

from django.contrib.auth import authenticate
from django.http import HttpResponseForbidden
from rest_framework.authtoken.models import Token

class AuthMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        user = authenticate(request=request)

        if user and user.is_active:
            request.user = user
            return self.get_response(request)
        else:
            return HttpResponseForbidden()

class TokenAuthMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if 'HTTP_AUTHORIZATION' in request.META:
            auth_header = request.META['HTTP_AUTHORIZATION']
            auth_token = auth_header.split(' ')[1]
            try:
                token = Token.objects.get(key=auth_token)
                request.user = token.user
            except Token.DoesNotExist:
                pass

        return self.get_response(request)

该示例代码包括以下部分:

  • 实现了AuthMiddleware中间件类,用于用户权限验证。在__call__方法中,使用authenticate函数来验证用户,如果验证成功,将用户信息存储在请求对象中,否则返回HttpResponseForbidden。
  • 实现了TokenAuthMiddleware中间件类,用于Token验证。在__call__方法中,首先检查请求头中是否有Authorization字段,如果有,则获取Token值,并使用Token.objects.get函数查询数据库中是否有匹配的Token。如果找到了Token,则将该Token对应的用户信息存储在请求对象中。
  • 将这两个中间件添加到Django项目的中间件列表中,以便对所有视图函数进行用户权限验证和Token验证。例如,在settings.py文件中添加以下代码:

MIDDLEWARE = [
    # ...
    'path.to.AuthMiddleware',
    'path.to.TokenAuthMiddleware',
    # ...
]

对于Token的存储方式,有以下几种常见的选择:

  1. 数据库存储:将Token保存在数据库中,每次需要验证Token时,从数据库中查询Token并进行验证。这种方式的优点是安全性高,不容易被攻击,而且Token的管理也比较方便。缺点是每次需要验证Token时都要查询数据库,会增加一定的性能开销。
  2. 前端缓存存储:将Token保存在前端缓存中,每次需要验证Token时,直接从前端缓存中读取。这种方式的优点是速度快,不需要每次都查询数据库,而且可以降低服务器的压力。缺点是安全性相对较低,容易被攻击。
  3. 分布式缓存存储:将Token保存在分布式缓存中,每次需要验证Token时,直接从缓存中读取。这种方式结合了前两种方式的优点,安全性较高,速度也比较快,而且可以支持分布式部署。

推荐使用第三种方法

分布式缓存存储可以使用诸如Redis、Memcached等分布式缓存系统来实现
下面以Redis为例,介绍如何实现基于Redis的Token存储

首先需要在Django的settings.py中配置Redis:
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

其中,LOCATION为Redis的连接地址,可以根据实际情况进行配置
然后可以使用Django的缓存API来实现Token的存储和读取。例如:
from django.core.cache import cache

# 存储Token
# 可以使用cache.set()方法中的timeout参数来设置过期时间
cache.set("token_key", "token_value",timeout=600)

# 读取Token
token_value = cache.get("token_key")

标签:__,缓存,get,验证,request,校验,Django,Token
From: https://www.cnblogs.com/SlookUp/p/17265093.html

相关文章

  • 如何使用责任链默认优雅地进行参数校验?
    前言项目中参数校验十分重要,它可以保护我们应用程序的安全性和合法性。我想大家通常的做法是像下面这样做的:@Overridepublicvoidvalidate(SignUpCommandcommand){......
  • django使用后台admin修改/删除记录的同时更新文件
    问题使用django自带admin后台删除表的时候,因为文件是存在服务器的,所以是只是删除了数据库的数据,而服务器的文件还存在解决models.py#模型类class......
  • django查询优化之是否存在
    res=Booking.objects.filter()#方法一:exists()ifres.exists():print('querysethasdata')else:print('querysethasnodata')#方法二:count()==0i......
  • django中celery的使用
    创建django项目$django-adminstartprojectproj$cdproj$tree.├──manage.py└──proj├──__init__.py├──asgi.py├──settings.......
  • Django使用已经存有数据的mysql数据库(搬自简书 LeslieLiang)
    由于在django中数据表的操作都是通过models去执行的,所以在你需要使用数据库之前需要在app中的models.py文件中事先去写好需要的表及字段,这是一件比较麻烦的事,那如何在事先......
  • 数据正则相关校验
    前端相关的正则校验1.常规手机号校验constreg=/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/或constreg=/^1(3[0-9]|4[0145......
  • Django笔记八之model中Meta参数的使用
    前面介绍了model的字段属性,字段类型,这篇笔记介绍一下model的Meta选项。这个选项提供了一些参数,比如排序(ordering),表名(db_table)等。但这都不是必需的,都是作为可选项,......
  • modbus CRC校验源码转载
     c#CRC校验 用于学习记录原文载自:https://www.cnblogs.com/ayxj/p/11481969.html用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)   ......
  • 关于CRC校验的解释
    CRC校验(循环冗余校验)CRC即循环冗余校验码(CyclicRedundancyCheck):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查......
  • expressjwt的getToken如何使用
    expressjwt()是一个Express中间件,用于验证JWT(JSONWebTokens)。它会检查请求头中是否存在Authorization字段,并且该字段的值是否是符合JWT规范的格式。如果JWT有效......