Django REST framwork的权限验证实例


Posted in Python onApril 02, 2020

在这里插入代码片# Django REST framwork的权限验证

一、用户是否登录

(1)判断用户是否登录;

permission_classes = (IsAuthenticated, )

注意:permission_classes设置的是:验证的是用户是否登录、用户是否可以操作该数据等的权限;

权限组合方式,目前支持:与&(and) 或|(or) 非~(not)

例如:permission_classes = (SecAdminPermission | AudAdminPermission,)

注意:使用元组 (SecAdminPermission | AudAdminPermission,)或列表[ SecAdminPermission | AudAdminPermission]都可以。

(2)设置用户认证方式;

authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)

注意:authentication_classes设置的是:用户可以通过哪种方式登录系统,例如:JWT或传统的用户名+密码方式登录。

具体代码如下:

from rest_framework.permissions import IsAuthenticated # 判断用户是否登录
from rest_framework_jwt.authentication import JSONWebTokenAuthentication # jwt用户认证
class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
      mixins.DestroyModelMixin, viewsets.GenericViewSet):
 """
 list:
  获取用户收藏列表
 retrieve:
  判断某个商品是否已经收藏
 create:
  收藏商品
 delete:
  取消收藏
 """
 # 权限判断:IsAuthenticated表示是否已经登录,IsOwnerOrReadOnly表示数据是不是属于当前登录用户
 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
 # 用户认证:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication
 authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
 # 定义通过哪个参数来定位实例
 lookup_field = "goods_id" # 在详细页面时,搜索goods_id来确认该商品有没有被收藏,是在当前用户下进行搜索的

 def get_queryset(self):
  """获取当前登录用户的收藏信息"""
  return UserFav.objects.filter(user=self.request.user)

 # 方法一:修改商品收藏数
 # def perform_create(self, serializer):
 #  """修改商品收藏数"""
 #  instance = serializer.save()
 #  goods = instance.goods
 #  goods.fav_num += 1
 #  goods.save()

 # 动态设置序列化类
 def get_serializer_class(self):
  if self.action == "list":
   return UserFavDetailSerializer
  elif self.action == "create":
   return UserFavSerializer

  return UserFavSerializer

二、用户是否对该数据有操作权限;

(1)自定义权限验证

前提:待验证对象有user字段;

from rest_framework import permissions

# 权限判断:数据是不是属于当前登录用户
class IsOwnerOrReadOnly(permissions.BasePermission):
 """
 Object-level permission to only allow owners of an object to edit it.
 Assumes the model instance has an `owner` attribute.
 """

 def has_object_permission(self, request, view, obj):
  # 1 只读
  # Read permissions are allowed to any request,
  # so we'll always allow GET, HEAD or OPTIONS requests.
  if request.method in permissions.SAFE_METHODS: # 是不是安全的访问方法
   return True
 # 2 写权限
  # Instance must have an attribute named `owner`.
  # return (obj.publisher if obj.publisher else self.fans )== request.user
  return obj.user== request.user # 判断当前数据是不是登录用户的数据

(2)在接口中,添加数据权限验证;

class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
      mixins.DestroyModelMixin, viewsets.GenericViewSet):
 """
 list:
  获取用户收藏列表
 retrieve:
  判断某个商品是否已经收藏
 create:
  收藏商品
  delete:
   取消收藏
 """
 # 权限判断:IsAuthenticated表示是否已经登录,IsOwnerOrReadOnly表示数据是不是属于当前登录用户
 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
 # 用户认证:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication
 authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
 # 设置
 lookup_field = "goods_id" # 在详细页面时,搜索goods_id来确认该商品有没有被收藏,是在当前用户下进行搜索的

 def get_queryset(self):
  """获取当前登录用户的收藏信息"""
  return UserFav.objects.filter(user=self.request.user)

补充知识:django rest framework api授权与认证

djangorestf 官方文档 授权与认证教程

permissions.py

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
  '''
  常规的授权是 只有拥有者才能编辑它
  '''

  def has_object_permission(self, request, view, obj):
    # 读权限 向所有请求开放
    # 所以我们总是允许get, head or options requests.
    if request.method in permissions.SAFE_METHODS:
      return True

    # 写权限 只给拥有者
    return obj.owner == request.user

view.py

'''基于泛型类的视图'''
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer, UserSerializer
from rest_framework import generics
from snippets.permissions import IsOwnerOrReadOnly
from django.contrib.auth.models import User

class UserList(generics.ListAPIView):
  '''
  User表的列表api视图 查 增 操作
  '''
  queryset = User.objects.all()
  serializer_class = UserSerializer

class UserDetail(generics.RetrieveDestroyAPIView):
  '''
  User表的详情api视图 查 改 删操作
  '''
  queryset = User.objects.all()
  serializer_class = UserSerializer



class SnippetList(generics.ListCreateAPIView):
  permission_classes = [permissions.IsAuthenticatedOrReadOnly]
  queryset = Snippet.objects.all()
  serializer_class = SnippetSerializer

  def perform_create(self, serializer):
    serializer.save(owner=self.request.user)


class SnippetDetail(generics.RetrieveDestroyAPIView):
  # detail 所有人都能读,但是只有拥有者可以更改

  # permissions.IsAuthenticatedOrReadOnly 表示没有认证的人有读的权限,认证的人有所有权限
  # IsOwnerOrReadOnly 通过了前面的授权之后,还要通过这个授权
  # 当所有的授权都通过的时候 所有的对象实例都返回true 表示授权通过
  permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
  queryset = Snippet.objects.all()
  serializer_class = SnippetSerializer

总结:通过传递permission_classes 类变量 传递授权类,

1、请求要进行某个操作的时候 ->

2、传递参数将授权类列表中的多个授权类实例化得到实例化对象->

3、调用所有授权实例对象的has_、permission以及has_object_permission方法 ->

4、所有的返回结果都为true ->

5、该操作的授权才通过,数据操作向下继续进行。

以上这篇Django REST framwork的权限验证实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用百度API上传文件到百度网盘代码分享
Nov 08 Python
Python中有趣在__call__函数
Jun 21 Python
浅谈对yield的初步理解
May 29 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
解决python中无法自动补全代码的问题
Dec 04 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
Django工程的分层结构详解
Jul 18 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
Python利用capstone实现反汇编
Apr 06 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 #Python
在 Pycharm 安装使用black的方法详解
Apr 02 #Python
Python Numpy中数据的常用保存与读取方法
Apr 01 #Python
Python PyQt5整理介绍
Apr 01 #Python
django之导入并执行自定义的函数模块图解
Apr 01 #Python
在脚本中单独使用django的ORM模型详解
Apr 01 #Python
Python视频编辑库MoviePy的使用
Apr 01 #Python
You might like
php实现发送微信模板消息的方法
2015/03/07 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
JS 自动安装exe程序
2008/11/30 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
js密码强度检测
2016/01/07 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
python实现数组插入新元素的方法
2015/05/22 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
Python requests模块cookie实例解析
2020/04/14 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
波兰补充商店:Muscle Power
2018/10/29 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
为什么要有struct关键字
2012/05/08 面试题
行政专员工作职责
2013/12/22 职场文书
贷款委托书
2014/08/01 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
工作简报怎么写
2015/07/21 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python