Django REST framwork的权限验证实例
在这里插入代码片# 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的权限验证实例就是小编分享给大家的全部内容了,希望能给大家一个参考。
- 学Java有什么好方法?刻苦学技术让我最终成为自信的码农
- expect+scp传输文件发现文件丢失
- IBM WebSphere MQ 7.5基本用法
- QPS的计算
- Django----中间件详解
- linux 添加用户到sudo中
- 机器学习之白话adaboost元算法
- 查看占用内存多的进程
- jboss EAP 6.2 + Message Drive Bean(MDB) 整合IBM Webshpere MQ 7.5
- 通过jenkins API去build一个job
- Django---分页器、中间件
- 启动jenkins服务错误
- 如果未来的AI拥有意识,你舍得不理它吗?
- centos下安装python3
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 剑指Offer LeetCode 面试题56 - II. 数组中数字出现的次数 II
- 站在软件工程的角度重新思考面向对象(含高清图谱)
- 剑指Offer LeetCode 面试题57. 和为s的两个数字
- 白嫖Layui树型可折叠,可自定义,可搜索表格的实例
- 剑指Offer LeetCode 面试题53 - II. 0~n-1中缺失的数字
- 聊聊dubbo-go的DubboPackage
- 剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
- Java虚拟机运行时数据区精华总结
- 剑指Offer LeetCode 面试题50. 第一个只出现一次的字符
- 剑指Offer LeetCode 面试题40. 最小的k个数
- 剑指Offer LeetCode 面试题39. 数组中出现次数超过一半的数字
- 解决Ajax发送DELETE请求时后台无法接收到参数的问题(Restful风格)
- 解决layui的table数据重载reload where参数会保留上次条件的问题
- 终于弄懂了Layui表格重载数据
- 剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面