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

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

自定义权限

是时候获得我们的第一个自定义权限了。 作为我们现在的简要回顾:我们有两个用户,testuser 和超级用户帐户。 我们的数据库中有一个博客帖子,由超级用户创建。


我们只希望特定博客文章的作者能够对其进行编辑或删除; 否则,博客文章应为只读。 因此,超级用户帐户应具有对单个博客实例的完整 CRUD 访问权限,而常规用户 testuser 应该没有。


使用 Control + c 停止本地服务器,并在我们的帖子应用中创建一个新的 permissions.py文件。

(blogapi) $ touch posts/permissions.py


在内部,Django REST Framework 依赖于 BasePermission 类,所有其他权限类都从该 BasePermission 类继承。 这意味着诸如 AllowAny,IsAuthenticated 之类的内置权限设置会对其进行扩展。 这是 Github 上可用的实际源代码

class BasePermission(object): 
    """
    A base class from which all permission classes should inherit. 
    """
    def has_permission(self, request, view): 
        """
        Return `True` if permission is granted, `False` otherwise.
        """
        return True
    def has_object_permission(self, request, view, obj): 
        """
        Return `True` if permission is granted, `False` otherwise. 
        """
        return True


要创建自己的自定义权限,我们将覆盖 has_object_permission方法。 具体来说,我们希望对所有请求都允许只读,但对于任何写入请求(例如编辑或删除),作者必须与当前登录的用户相同。


这是我们的 posts / permissions.py 文件的内容。

# posts/permissions.py
from rest_framework import permissions
class IsAuthorOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        # Read-only permissions are allowed for any request 
        if request.method in permissions.SAFE_METHODS:
            return True
        # Write permissions are only allowed to the author of a post
        return obj.author == request.user


我们在顶部导入权限,然后创建自定义类 IsAuthorOrReadOnly,该类扩展了 BasePermission。 然后,我们覆盖 has_object_permission。 如果请求包含 SAFE_METHODS 中包含的 HTTP 动词(包含 GET,OPTIONS 和 HEAD 的元组),则该请求为只读请求,并授予权限。


否则,该请求是针对某种类型的写入的,这意味着需要更新 API 资源,以便创建,删除或编辑功能。 在这种情况下,我们检查所讨论对象的作者(即我们的博客文章 obj.author)是否与发出请求 request.user 的用户匹配。


回到 views.py 文件中,我们应该导入 IsAuthorOrReadOnly,然后我们可以添加 PostDetail 的``permission_classes`。

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

我们完成了。 让我们测试一下。 导航到“帖子详细信息”页面。 确保您使用帖子的作者超级用户帐户登录。 因此它将在页面的右上角可见。


网络异常,图片无法展示
|


但是,如果您注销然后使用 testuser 帐户登录,则页面会更改。


由于允许只读权限,因此我们可以查看此页面。 但是,由于自定义的 IsAuthorOrReadOnly 权限类,我们无法发出任何 PUT 或 DELETE 请求。


请注意,通用视图将仅检查对象级权限以获取检索单个模型实例的视图。 如果您需要对列表视图进行对象级过滤(对于实例集合),则需要通过覆盖初始查询集进行过滤。

总结

设置适当的权限是任何 API 的重要组成部分。 作为一般策略,最好设置严格的项目级别权限策略,以使只有经过身份验证的用户才能查看 API。 然后,根据需要在特定的 API 端点上更易于访问视图级别或自定义权限。

相关文章
|
4月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
5月前
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。
|
5月前
|
人工智能 自然语言处理 机器人
使用 API 编程开发扣子应用
扣子(Coze)应用支持通过 API 编程,将 AI 聊天、内容生成、工作流自动化等功能集成至自有系统。主要 API 包括 Bot API(用于消息交互与会话管理)及插件与知识库 API(扩展功能与数据管理)。开发流程包括创建应用、获取密钥、调用 API 并处理响应,支持 Python 等语言。建议加强错误处理、密钥安全与会话管理,提升集成灵活性与应用扩展性。
1653 0
|
4月前
|
API 开发者 数据采集
高效获取淘宝商品详情:API 开发实现链接解析的完整技术方案
2025反向海淘新机遇:依托代购系统,聚焦小众垂直品类,结合Pandabay数据选品,降本增效。系统实现智能翻译、支付风控、物流优化,助力中式养生茶等品类利润翻倍,新手也能快速入局全球市场。
高效获取淘宝商品详情:API 开发实现链接解析的完整技术方案
|
5月前
|
数据采集 缓存 API
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
本文详解小红书笔记详情API的开发对接、实战场景与收益模式,涵盖注册避坑、签名生成、数据解析全流程,并分享品牌营销、内容创作、SAAS工具等落地应用,助力开发者高效掘金“种草经济”。
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
|
4月前
|
存储 缓存 算法
淘宝买家秀 API 深度开发:多模态内容解析与合规推荐技术拆解
本文详解淘宝买家秀接口(taobao.reviews.get)的合规调用、数据标准化与智能推荐全链路方案。涵盖权限申请、多模态数据清洗、情感分析、混合推荐模型及缓存优化,助力开发者提升审核效率60%、商品转化率增长28%,实现UGC数据高效变现。
|
4月前
|
存储 缓存 算法
亚马逊 SP-API 深度开发:关键字搜索接口的购物意图挖掘与合规竞品分析
本文深度解析亚马逊SP-API关键字搜索接口的合规调用与商业应用,涵盖意图识别、竞品分析、性能优化全链路。通过COSMO算法解析用户购物意图,结合合规技术方案提升关键词转化率,助力卖家实现数据驱动决策,安全高效优化运营。
|
5月前
|
算法 API 数据库
生鲜电商技术实践:基于保质期API的自动下架系统保障食品安全
基于保质期提醒API与自动化工作流,实现生鲜商品临期智能预警与自动下架。通过设定差异化预警阈值(如蔬菜2天、冷冻品7天),每日扫描数据库并触发下架指令,确保食品安全合规,降低损耗与客诉,提升运营效率。
359 0
|
6月前
|
测试技术 API 开发工具
API文档该怎么写,开发效率能翻几倍?
API文档是提升开发效率与协作的关键因素,本文探讨了API文档的核心要素、常见类型及编写规范,并介绍了如何借助现代化工具如Apifox实现高效管理与维护,助力团队打造高质量的API文档体系。
|
6月前
|
算法 前端开发 API
京东比价项目开发实录:京东API接口(2025)
本文分享了作者在电商开发中对接京东商品详情API的实战经验,涵盖了申请权限、签名算法、限流控制、数据解析等常见问题,并提供了亲测有效的Python代码示例,帮助开发者避坑。