赞
踩
在前面教程中我们以博客为例,使用DRF开发了博客文章列表资源和单篇文章资源这两个API,支持客户端以各种请求方式对文章资源进行增删查改。然而目前的 API 对谁可以新建、编辑或删除文章资源(Article)没有限制,我们本例中希望通过认证(Authentication)与权限(Permission)来实现一些更实用的功能:
只有经过身份验证的用户可以创建article文章(匿名用户不允许通过POST提交新文章)。
未经身份验证的请求应具有完全只读访问权限。
单篇article资源始终与创建者相关联,只有 article 的创建者可以更新或删除它。
认证(Authentication)与权限(Permission)的区别
认证(Authentication)与权限(Permission)不是一回事。认证是通过用户提供的用户ID/密码组合或者Token来验证用户的身份。权限(Permission)的校验发生验证用户身份以后,是由系统根据分配权限确定用户可以访问何种资源以及对这种资源进行何种操作,这个过程也被称为授权(Authorization)。
无论是Django还是DRF, 当用户成功通过身份验证以后,系统会把已通过验证的用户对象与request请求绑定,这样一来你就可以使用request.user获取这个用户对象的所有信息了。
接下来我们就要开始动手解决文初提出的3个问题了。
前情摘要
在前面的教程中我们编写ArticleList和ArticleView两个基于类的视图(如下所示)。前者如果收到GET请求会返回文章资源列表,如果收到POST请求则添加文章;后者如果收到GET请求就返回单篇文章资源,如果收到PUT或DELETE请求,就对文章资源进行修改或删除。
- from rest_framework import generics
-
-
- class ArticleList(generics.ListCreateAPIView):
- queryset = Article.objects.all()
- serializer_class = ArticleSerializer
- # important
- def perform_create(self, serializer):
- serializer.save(author=self.request.user)
-
-
- class ArticleDetail(generics.RetrieveUpdateDestroyAPIView):
- queryset = Article.objects.all()
- serializer_class =ArticleSerializer
以上两个视图其实是有很大问题的,因为任何用户包括匿名用户也可以对文章资源进行修改。比如当你访问单篇文章资源时,你不仅可以看到红色的delete按钮和修改文章内容的表单,而且可以在未登录的情况对它们进行操作。
【GET】127.0.0.1:8000/v1/articles/9
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。