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实现矩阵乘法的方法
Jun 28 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
基于Python os模块常用命令介绍
Nov 03 Python
对python中if语句的真假判断实例详解
Feb 18 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 Python
python里dict变成list实例方法
Jun 26 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 Python
python自动分箱,计算woe,iv的实例代码
Nov 22 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
python中re模块知识点总结
Jan 17 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面向对象的使用教程 简单数据库连接
2006/11/25 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
js GridView 实现自动计算操作代码
2009/03/25 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
nodeJS微信分享
2017/12/20 NodeJs
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
Python修改Excel数据的实例代码
2013/11/01 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
python实现飞机大战游戏
2020/10/26 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
教学质量评估实施方案
2014/03/17 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
学校政风行风整改方案
2014/10/25 职场文书
讲文明倡议书
2015/04/29 职场文书
刘胡兰观后感
2015/06/16 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书