Django REST framework安全实践:轻松实现认证、权限与限流功能

系列文章目录


文章目录


前言

    在本文中,我们将深入探讨Django REST framework中的三大核心组件:认证、权限与限流 。首先,我们将揭示认证在保护API访问权限、验证用户身份方面的关键作用,并介绍如何在Django REST framework中配置和使用不同的认证方案。接着,我们将探讨权限控制,学习如何限制不同用户对API资源的访问,确保敏感数据的安全。最后,我们将讨论限流技术,了解如何通过限制请求频率来防止API被滥用,保障服务的稳定性和可用性。


一、认证

Django 自带一个用户验证系统。它负责处理用户账号、组、权限和基于cookie的用户会话。
Django 验证系统处理验证和授权。简单来说,验证 检验用户是否是他们的用户,授权决定已验证用户能做什么。
认证系统由以下部分组成:

  • 用户

  • 权限:二进制(是/否)标识指定用户是否可以执行特定任务。

  • :将标签和权限应用于多个用户的一般方法。

  • 可配置的密码哈希化系统

  • 为登录用户或限制内容提供表单和视图工具

  • 可插拔的后端系统
    Django 里的验证系统旨在通用化,不提供一些常见的 web 验证系统的特性。其中一些常见问题的解决方案已在第三方包中实现。

  • 密码强度检查

  • 限制登录尝试

  • 针对第三方的身份验证(例如OAuth)

  • 对象级权限
    可以在配置文件中配置全局默认的认证方案,认证需要和权限一起使用

python 复制代码
#settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':(
 
        #基本认证
       'rest_framework.authentication.BasicAuthentication',
		# session认证
       'rest_framework.authentication.SessionAuthentication', 
    ),
)

认证失败会有两种可能的返回值:

  • 401 Unauthorized 未认证
  • 403 Permission Denied 权限被禁止

二、权限

权限控制 可以限制用户对于视图的访问和对于具体数据对象的访问。

在执行视图的dispatch()方法前,会先进行视图访问权限的判断 。在通过get_object()获取具体对象时,会进行对象访问权限的判断
可以在配置文件中设置默认的权限管理类,如:

python 复制代码
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

如果未指明,则采用如下默认配置:

python 复制代码
REST_FRAMEWORK = {
'DEFAULT PERMISSION CLASSES' : (
	'rest _framework.permissions.ALLowAny'
	)
}

提供的权限:

  • AllowAny 允许所有用户
  • IsAuthenticated 仅通过认证的用户
  • IsAdminUser 仅管理员用户
  • IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get读取

三、限流

限流权限 类似,因为它确定是否应该授权请求。 限流阀 指示了一种临时状态,并用于控制客户端可以对API进行的请求速率。

1. 匿名用户全局限流

可以对接口访问的频次进行限制,以减轻服务器压力。特别是限制爬虫的抓取。
在配置文件中,使用DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES进行全局配置:

python 复制代码
  REST_FRAMEWORK = {
      'DEFAULT_THROTTLE_CLASSES': (
          # 限制所有匿名未认证用户,使用IP区分用户
          'rest_framework.throttling.AnonRateThrottle',
          #认证用户的限流
          'rest_framework.throttling.UserRateThrottle',
      ),
      'DEFAULT_THROTTLE_RATES': {
          # 可以使用 second, minute, hour 或day来指明周期
          'anon': '3/minute',
          'user': '5/minute'
      }
  }

2. 匿名用户局部限流

视图中使用throttle_classes属性设置限流用户类型

python 复制代码
  from rest_framework.generics import ListAPIView
  from serializer import UserSerializer, User
  
  from rest_framework.throttling import AnonRateThrottle



  class UserView(ListAPIView):
      queryset = User.objects.all()
      serializer_class = UserSerializer
      throttle_classes = [AnonRateThrottle]  
      # 指明针对匿名用户进行限流,限流频率全局配置

在项目配置文件中针对用户类型设置具体频率:

python 复制代码
  REST_FRAMEWORK = {
      'DEFAULT_THROTTLE_RATES': {
          # 可以使用 second, minute, hour 或day来指明周期
          'anon': '3/minute',
          'user': '5/minute'
      }
  }

四、认证、权限、限流全局配置示例

python 复制代码
# settings.py
# 认证,权限,限流
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES':(
        #基本认证
        'rest_framework.authentication.BasicAuthentication',

        # session认证
        'rest_framework.authentication.SessionAuthentication', 
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_THROTTLE_CLASSES': (
          # 限制所有匿名未认证用户,使用IP区分用户
          'rest_framework.throttling.AnonRateThrottle',
          #认证用户的限流
          'rest_framework.throttling.UserRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
          # 可以使用 second, minute, hour 或day来指明周期
          'anon': '3/minute',
          'user': '5/minute'
    }

}
相关推荐
带娃的IT创业者23 分钟前
监控并非安全:当隐私成为技术的祭品
java·开发语言·安全·数据安全·监控·隐私保护·加密技术
MartinYeung51 小时前
[论文学习]LLM-based AI Agent 安全威胁与防御系统性综述
人工智能·学习·安全
不会C语言的男孩2 小时前
TCP通信可视化工具,含下载地址
服务器·网络·安全
遇码4 小时前
开源 Data Agent 实战:用 Lakemind + DuckDB 让 LLM 安全分析本地数据
安全·开源
Chengbei114 小时前
VMware Workstation Pro 26H1免费虚拟化利器
运维·安全·web安全·自动化·系统安全·apache·安全架构
AI创界者5 小时前
打造内网安全防线:使用 Kali Linux 进行企业级漏洞风险自查与防御指南
linux·运维·安全
YOLO数据集集合13 小时前
吊装作业的“电子围栏”:YOLOV13如何用AI框住塔吊下的致命风险
人工智能·安全·yolo·目标检测
@insist12314 小时前
系统规划与管理师-信息安全规划核心考点解析:概述与安全架构
安全·软考·安全架构·系统规划与管理师·软件水平考试·系统规划与管理工程师
IT小白杨15 小时前
从移动指纹到App隔离:TikTok Shop跨境电商账号安全管理实战
安全·新媒体运营·业界资讯·指纹浏览器
humors22115 小时前
【分享】火绒恶意网址自定义规则,根据互联网应急中心部分威胁预警恶意代码制作
网络·安全·规则·火绒安全·恶意网址·应急中心