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冒泡排序算法的实现代码
Nov 21 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
用python找出那些被“标记”的照片
Apr 20 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
Python函数中的可变长参数详解
Sep 12 Python
python 遍历pd.Series的index和value
Nov 26 Python
Python 支持向量机分类器的实现
Jan 15 Python
keras之权重初始化方式
May 21 Python
python中常见错误及解决方法
Jun 21 Python
Django model class Meta原理解析
Nov 14 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
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
快速了解Python相对导入
2018/01/12 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
python cs架构实现简单文件传输
2020/03/20 Python
Python双向循环链表实现方法分析
2018/07/30 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
竞争与合作演讲稿
2014/05/12 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
保险内勤岗位职责
2015/04/13 职场文书
捐款通知怎么写
2015/04/24 职场文书
总经理聘用协议书
2015/09/21 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL