django restframework permission
与 authentication 和 throttling 一起,permission 决定是应该接受还是拒绝访问请求。
权限检查总是在视图的最开始处运行,在任何其他代码被允许进行之前。权限检查通常会使用 request.user 和 request.auth 属性中的认证信息来确定是否允许传入请求。
权限用于授予或拒绝不同类别的用户访问 API 的不同部分。
最简单的权限是允许通过身份验证的用户访问,并拒绝未经身份验证的用户访问。这对应于 REST framework 中的 IsAuthenticated 类。
稍微宽松的权限会允许通过身份验证的用户完全访问,而未通过身份验证的用户只能进行只读访问。这对应于 REST framework 中的 IsAuthenticatedOrReadOnly 类。
设置权限策略
默认权限策略可以使用 DEFAULT_PERMISSION_CLASSES setting 全局设置。例如
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
如果未指定,则此设置默认为允许无限制访问:
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
)
当然也可以基于 APIView 类的视图上设置身份验证策略
查看源码,restframework现成的类有7个,介绍如下常用四个
AllowAny:允许无限制访问
IsAuthenticated :允许访问任何经过身份验证的用户,并拒绝访问任何未经身份验证的用户
IsAdminUser:允许超级用户访问
IsAuthenticatedOrReadOnly:对经过身份验证的用户的允许完全访问,但对未经身份验证的用户的允许只读访问
@six.add_metaclass(BasePermissionMetaclass)
class BasePermission(object):
"""
A base class from which all permission classes should inherit.
""" def has_permission(self, request, view):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True def has_object_permission(self, request, view, obj):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True
但完全可以我们自己来写,仅需要面向上述源码任意一个接口即可。
apps/app/permissions.py
from rest_framework.permissions import BasePermission class IsLoginReadOnly(BasePermission):
"""
自定义权限设置
"""
def has_permission(self,request,view): return all((request.user.is_authenticated,request.user.is_staff))
如果你需要测试请求是读取操作还是写入操作,则应该根据常量SAFE_METHODS
检查请求方法,SAFE_METHODS
是包含'GET'
, 'OPTIONS'
和'HEAD'
的元组
if request.method in permissions.SAFE_METHODS:
# 检查只读请求的权限
else:
# 检查读取请求的权限
views.py
from rest_framework import mixins
from rest_framework import viewsets from .models import UserProfile
from .serializers import UserProfileSerializer
from .permissions import IsAuthenticatedOrReadOnly class UsersListViewSets(viewsets.GenericViewSet,mixins.ListModelMixin):
"""
用户列表
"""
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
对象级权限
实际场景下,我们往往需要对权限细分:
POST 请求要求用户对模型实例具有 add 权限。
PUT 和 PATCH 请求要求用户对模型实例具有 edit 权限。
DELETE 请求要求用户对模型实例具有 delete 权限。
这就需要我们重写APIView下的has_permissions方法
views.py
from .permission import UserAddPermission
from .permission import UserDeletePermission
from .permission import UserEditPermission
from .permission import UserQueryPermission # permission_classes = (UserQueryPermission,)
def get_permissions(self):
if self.action == "create":
self.permission_classes = (UserAddPermission,)
elif self.action == "list":
self.permission_classes = (UserQueryPermission,)
elif self.action == "update":
self.permission_classes = (UserEditPermission,)
elif self.action == "destroy":
self.permission_classes = (UserDeletePermission,)
return super().get_permissions()
permission.py
class UserAddPermission(BasePermission):
"""
增加用户权限
"""
def has_permission(self, request ,view):
user = request.user
if user.is_authenticated:
permissons = user.has_permissons()
return "add user" in permissons
遇到了问题,即使UsersListViewSets继承了viewsets.ModelViewSet,该接口依旧只允许GET, POST, HEAD, OPTIONS四种方法,
没有put和delete.
解决:自己手动绑定。。。
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs) def delete(self,request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
django restframework permission的更多相关文章
- django restframework
一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...
- django restframework 的日常使用
本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...
- django restframework serializer 增加自定义字段
在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...
- django restframework jwt
既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...
- django restframework 快速入门
django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...
- Django Restframework 实践(一)
具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...
- django: rest-framework的 分页和过滤
django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...
- Django RestFramework (DRF)
准备: 下载 pip install djangorestframework 一 APIView源码解析 1 预备知识 CBV(class based view)FBV(function based ...
- 测开大佬告诉你:如何5分钟快速创建restful风格的API接口-使用django restframework框架
一.思考❓❔ 1.创建API接口难吗? 软件测试工程师: 只测过API接口, 从没创建过 应该需要掌握一门后端开发语言和后端开发框架吧!? 脑容量有限,想想就可怕 2.如何创建API接口呢? 使用Dj ...
随机推荐
- pthread_exit在main线程中的用处
在main线程中调用pthread_exit会起到只让main线程退出,但是保留进程资源,供其他由main创建的线程使用,直至所有线程都结束,但在其他线程中不会有这种效果 https://stacko ...
- redis的几种数据导入导出方式【转】
环境说明:202.102.221.11 redis源实例202.102.221.12 redis目标实例202.102.221.13 任意linux系统 一.redis-dump方式 1.安装redi ...
- 会话固定攻击 - yxcms session固定漏洞
目录 会话固定攻击 e.g. yxcms session固定攻击 分析 了解更多 会话固定攻击 Session fixation attack(会话固定攻击)是利用服务器的session不变机制,借他 ...
- Oracle 查询权限视图
在Oracle中有很多用于查权限的视图,但很多人在需要查权限时会很困惑,不知道该用哪个视图去查,这里我列出几个常见的用于查权限的视图及其用法: 1DBA_ROLE_PRIVS 该视图主要有以下2个作用 ...
- 一次CMS GC问题排查过程(理解原理+读懂GC日志)
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下.这篇文章分三部分: 1.问题的场景和处理过程:2.GC的一些理论东西:3.看懂GC的日志 先说一下问题吧 ...
- vue 路由元信息
官方文档:路由meta元信息 前言: 在设置面包屑导航还有菜单栏的时候,路由的meta字段可以自定义我们需要的信息,然后路由跳转的时候,提供我们判断条件 文档: 定义路由的时候可以配置 meta 字段 ...
- Python距离放弃又近了Day02
今天,来时大概复习了上一天讲过的一些计算机基础和简单数据类型和if语句,第二天就来了循环,还是个while的死循环,突然想到还是电脑好,不管循环多少次,只要电脑不崩溃,就能一直精准的算下去,这就和人不 ...
- python之面相对象程序设计
一 面向对象的程序设计的由来 面向对象设计的由来见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 面向对象的程序设计:路飞学院版 ...
- SQL FOREIGN KEY 约束
SQL FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. 让我们通过一个例子来解释外键.请看下面两个表: "Persons&quo ...
- CF1012B Chemical table
$CF1012B Chemical table 给你一个 \(n\times m\) 的矩形,一开始有 \(q\) 个格子上被标记.对于任意两行两列,如果交汇的四个格子中有三个被标记,那么第 \(4\ ...