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

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

前言

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


一、认证

Django 自带一个用户验证系统。它负责处理用户账号、组、权限和基于cookie的用户会话。

Django 验证系统处理验证和授权。简单来说,验证检验用户是否是他们的用户,授权决定已验证用户能做什么。

认证系统由以下部分组成:

  • 用户
  • 权限:二进制(是/否)标识指定用户是否可以执行特定任务。
  • :将标签和权限应用于多个用户的一般方法。
  • 可配置的密码哈希化系统
  • 为登录用户或限制内容提供表单和视图工具
  • 可插拔的后端系统

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

  • 密码强度检查
  • 限制登录尝试
  • 针对第三方的身份验证(例如OAuth)
  • 对象级权限

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

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

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

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

二、权限

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


在执行视图的dispatch()方法前,会先进行视图访问权限的判断。在通过get_object()获取具体对象时,会进行对象访问权限的判断

可以在配置文件中设置默认的权限管理类,如:

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

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

REST_FRAMEWORK = {
'DEFAULT PERMISSION CLASSES' : (
  'rest _framework.permissions.ALLowAny'
  )
}

提供的权限:

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

三、限流

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

1. 匿名用户全局限流

可以对接口访问的频次进行限制,以减轻服务器压力。特别是限制爬虫的抓取。

在配置文件中,使用DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES进行全局配置:

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属性设置限流用户类型

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]  
      # 指明针对匿名用户进行限流,限流频率全局配置

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

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

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

# 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'
    }
}
相关文章
|
1月前
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
54 0
|
3月前
|
存储 监控 数据库
Django 后端架构开发:高效日志规范与实践
Django 后端架构开发:高效日志规范与实践
69 1
|
1月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
75 1
|
12天前
|
程序员 API 数据库
Django/Flask深度揭秘:揭秘那些让程序员爱不释手的神奇功能!
在Web开发领域,Django与Flask凭借其独特魅力和强大功能深受程序员喜爱。Django作为全能型框架,以其ORM、模板引擎和丰富的内置功能著称;Flask则以轻量级、灵活的路由系统和强大的扩展生态见长。两者各具特色,为开发者提供了高效、灵活的开发工具。
35 4
|
1月前
|
存储 Python
使用django构建一个多级评论功能
使用django构建一个多级评论功能
20 0
|
3月前
|
存储 关系型数据库 MySQL
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
本文介绍了一个基于Python Django框架开发的医院管理系统,该系统设计了管理员、用户和医生三个角色,具备多用户功能,并使用MySQL数据库进行数据存储和管理。
133 4
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
|
3月前
|
安全 数据库 数据安全/隐私保护
|
3月前
|
负载均衡 应用服务中间件 网络安全
Django后端架构开发:Nginx服务优化实践
Django后端架构开发:Nginx服务优化实践
58 2
|
3月前
|
数据可视化 安全 前端开发
基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据
本文介绍了一个基于Django框架开发的美团药品数据分析与可视化系统,该系统具备多用户功能,支持数据的增删改查操作,并采用MySQL、pandas、echarts和bootstrap技术栈,为用户提供了一个高效、安全且实用的药品数据管理和分析平台。
基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据
|
3月前
|
JSON API 数据安全/隐私保护
哇塞!Django REST framework 太逆天啦!构建 API 服务从未如此轻松,你还不来试试?
【8月更文挑战第31天】Django REST framework(DRF)是基于Django框架的高效Web API开发工具,提供序列化、视图集、路由等功能,简化API构建流程。使用DRF可轻松实现数据的序列化与反序列化,并支持权限管理和认证机制以保障API安全。安装DRF只需通过`pip install djangorestframework`命令。要创建基本项目,先安装Django并创建新应用,定义模型、序列化器及视图集,最后配置路由。测试API时,可通过Postman发送HTTP请求验证功能。无论项目大小,DRF均能提供强大支持。
40 0