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读取网页内容的方法
Jul 30 Python
浅谈python内置变量-reversed(seq)
Jun 21 Python
Python数据结构与算法之字典树实现方法示例
Dec 13 Python
Python实现的计算器功能示例
Apr 26 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
Python中的asyncio代码详解
Jun 10 Python
Python 列表去重去除空字符的例子
Jul 20 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
Python sublime安装及配置过程详解
Jun 29 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
keras topN显示,自编写代码案例
Jul 03 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 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
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
javascript 节点遍历函数
2010/03/28 Javascript
JavaScript 基础篇(一)
2012/03/30 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
python实现Adapter模式实例代码
2018/02/09 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
学校安全工作制度
2014/01/19 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
优秀员工获奖感言
2014/03/01 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
党支部四风整改方案
2014/10/25 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
毕业酒会致辞
2015/07/29 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
优质护理心得体会
2016/01/22 职场文书
Python多线程 Queue 模块常见用法
2021/07/04 Python
基于Python实现西西成语接龙小助手
2022/08/05 Golang