Django API 开发:博客系统的权限管理(中)

简介: 安全性是任何网站的重要组成部分,但对于 Web API 而言则至关重要。 目前,我们的 Blog API 允许任何人进行完全访问。 没有任何限制; 任何用户都可以做任何极其危险的事情。 例如,匿名用户可以创建,阅读,更新或删除任何博客文章。 他们甚至没有创造一个! 显然,我们不希望这样做。

AllowAny

当前,任何匿名非授权用户都可以访问我们的 PostList 端点。 之所以知道这一点,是因为即使我们尚未登录,也可以看到我们的单个博客文章。 更糟糕的是,任何人都有权创建,编辑,更新或删除帖子!


在详细信息页面 http://127.0.0.1:8000/api/v1/1/ 上,该信息也是可见的,任何随机用户都可以更新或删除现有博客文章。



之所以仍然可以看到“发布列表”终结点和“详细列表”终结点,是因为我们之前在 settings.py 文件中将项目的项目级别权限设置为 AllowAny。 简要提醒一下,它看起来像这样:

# blog_project/settings.py
REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.AllowAny', 
    ]
}

视图层权限

我们现在想要的是将 API 访问限制为经过身份验证的用户。 我们可以在多个地方执行此操作-项目级,视图级或对象级-但是由于目前我们只有两个视图,因此我们从那里开始,并为每个视图添加权限。


在您的 posts/views.py文件中,从 Django REST 框架的顶部导入权限,然后向每个视图添加一个 permission_classes字段。

# posts/views.py
from rest_framework import generics, permissions # new
from .models import Post
from .serializers import PostSerializer
class PostList(generics.ListCreateAPIView): 
    permission_classes = (permissions.IsAuthenticated,) # new 
    queryset = Post.objects.all()
    serializer_class = PostSerializer
class PostDetail(generics.RetrieveUpdateDestroyAPIView): 
    permission_classes = (permissions.IsAuthenticated,) # new 
    queryset = Post.objects.all()
    serializer_class = PostSerializer


这就是我们所需要的。 通过 http://127.0.0.1:8000/api/v1/ 刷新可浏览的 API。 看看发生了什么!


我们不再看到我们的“帖子列表”页面。 取而代之的是,由于我们尚未登录,因此会收到不友好的 HTTP 403 禁止状态代码。由于我们没有权限,因此可浏览的 API 中没有表格可以编辑数据。



因此,目前只有登录的用户可以查看我们的 API。 如果您使用超级用户或 testuser 帐户重新登录,则可以访问 API 端点。


但是,请考虑一下随着 API 复杂性的增长会发生什么。 将来我们可能会有更多的视图和终点。 如果我们要在整个 API 中设置相同的权限设置,则向每个视图添加专用的 permission_class似乎是重复的。


最好只在项目级别更改一次权限,而不是对每个视图都进行一次更改,这会更好吗?

项目级别权限

此时,您应该点头。 在项目级别设置严格的权限策略并在视图级别根据需要放宽策略是一种更简单,更安全的方法。 这就是我们要做的。


幸运的是,Django REST Framework 随 附了许多我们可以使用的内置项目级权限设置,包括:


  • AllowAny-任何经过身份验证的用户都具有完全访问权限
  • IsAuthenticated-只有经过身份验证的注册用户才能访问
  • IsAdminUser-只有管理员/超级用户有权访问
  • IsAuthenticatedOrReadOnly-未经授权的用户可以查看任何页面,但只能查看经过身份验证的用户具有写,编辑或删除权限


要实施这四个设置中的任何一个,都需要更 DEFAULT_PERMISSION_CLASSES 设置和刷新我们的 Web 浏览器。 而已!


让我们切换到 IsAuthenticated ,这样只有经过身份验证或登录的用户才能查看 API。


更新 blog_project/settings.py,如下:

# blog_project/settings.py
REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated', # new
    ]
}


现在返回到 views.py 文件,并删除我们刚刚进行的权限更改。

# posts/views.py
from rest_framework import generics
from .models import Post
from .serializers import PostSerializer
class PostList(generics.ListCreateAPIView): 
    queryset = Post.objects.all() 
    serializer_class = PostSerializer
class PostDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Post.objects.all()
    serializer_class = PostSerializer


如果刷新“发布列表”和“详细列表” API 页面,您仍将看到相同的 403 状态代码。 现在,我们要求所有用户都必须先进行身份验证,然后才能访问 API,但是我们也始终可以根据需要进行其他视图级更改。

相关文章
|
19天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
111 45
|
10天前
|
存储 前端开发 搜索推荐
淘宝 1688 API 接口助力构建高效淘宝代购集运系统
在全球化商业背景下,淘宝代购集运业务蓬勃发展,满足了海外消费者对中国商品的需求。掌握淘宝1688 API接口是构建成功代购系统的關鍵。本文详细介绍如何利用API接口进行系统架构设计、商品数据同步、订单处理与物流集成,以及用户管理和客户服务,帮助你打造一个高效便捷的代购集运系统,实现商业价值与用户满意度的双赢。
|
1月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
39 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
20天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
32 2
|
24天前
|
监控 安全 测试技术
我们为什么要API管理系统呢?
API 管理系统通过接口标准化与复用、简化开发流程、版本管理、监控与预警、访问控制、数据加密、安全审计、集中管理与共享、协作开发、快速对接外部系统和数据驱动的决策等多方面优势,显著提高开发效率、增强系统可维护性、提升系统安全性、促进团队协作与沟通,并支持业务创新与扩展。
|
1月前
|
供应链 搜索推荐 数据挖掘
电商ERP系统中电商API接口的应用
电商API接口在电子商务中扮演着至关重要的角色,它们允许开发者将电商功能集成到自己的应用程序中,实现商品检索、订单处理、支付、物流跟踪等功能。以下是关于电商API接口的应用:
|
3月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
59 0
|
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均能提供强大支持。
41 0
|
8天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
20天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。