rest framework 权限
一、权限示例
需求:不同的用户类型有不同的权限
- 普通用户:只能查看个人信息相关,序号:1
- VIP 用户:只能查看个人信息相关,序号:2
- SVIP 用户:查看订单相关信息,序号:3
1、新建 app/utils/permission.py
:
class SVIPPermission(object):def has_permission(self, request, view):"""是否有权限"""if request.user.user_type != 3:return Falsereturn Trueclass MyPermission(object):"""普通、VIP 用户"""def has_permission(self, request, view):"""是否有权限"""if request.user.user_type == 3:return Falsereturn True
如果用户类型为 3 即 SVIP,那么就返回 True,否则返回 False。
Note:只有登录后的用户才有
request.user
,即在用户认证的时候,返回用户对象
2、views.py
from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework.authentication import BasicAuthentication
import hashlib
import time
from app import models
from django.http import JsonResponse
from .utils.auth import MyAuthentication
from .utils.permission import SVIPPermissionclass OrderView(APIView):"""订单管理"""# authentication_classes = [MyAuthentication, ] # 添加认证(因为已经全局设置了认证,所有就不单独设置了)permission_classes = [SVIPPermission, ] # 权限def get(self, request, *args, **kwargs):ret = {'code': 1000, 'msg': None, 'data': None, }ret['data'] = ORDER_DICTprint(request.user)return JsonResponse(ret)class UserInfo(APIView):"""用户个人信息"""permission_classes = [MyPermission, ]def get(self, request, *args, **kwargs):user_name = request.user.usernamereturn HttpResponse(user_name)
3、现在带上 token(表示已经登录),查看订单:
SVIP 用户:
4、查看用户个人信息:(rose:普通用户)
5、project/urls.py
:
为了遵循 RESTful API 规范,现在将 URL 修改为如下:
from django.contrib import admin
from django.urls import path
from app.views import IndexView, OrderView, UserInfourlpatterns = [path('admin/', admin.site.urls),path('api/v1/index/', IndexView.as_view()),path('api/v1/order/', OrderView.as_view()),path('api/v1/info/', UserInfo.as_view())]
二、全局配置
与认证一样,权限也可以全局配置和局部配置,全局配置可以使得所有的视图类生效,需要在 settings
中配置:
REST_FRAMEWORK = {"DEFAULT_AUTHENTICATION_CLASSES": ['app.utils.auth.MyAuthentication', ],"UNAUTHENTICATED_USER": lambda: '匿名用户',"UNAUTHENTICATED_TOKEN": None,"DEFAULT_PERMISSION_CLASSES": ['app.utils.permission.SVIPPermission'], # 这句}
如果想配置没有访问权限返回的信息,可以修改 app/utils/permission.py
:
class SVIPPermission(object):message = '必须 SVIP 才能访问!' # 这句def has_permission(self, request, view):"""是否有权限"""if request.user.user_type != 3:return Falsereturn True
三、内置权限
rest framework 也有内置的权限 rest_framework/permissions.py
:
@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 Truedef has_object_permission(self, request, view, obj):"""Return `True` if permission is granted, `False` otherwise."""return True
自定义的权限类,最好要继承 BasePermission
:
# app/utils/permisiion.py
from rest_framework.permissions import BasePermissionclass SVIPPermission(BasePermission):message = '必须 SVIP 才能访问!'def has_permission(self, request, view):"""是否有权限"""if request.user.user_type != 3:return Falsereturn True
四、权限认证流程(源码)
1、请求过来先执行 dispatch()
方法,dispatch()
方法中 initial()
初始化请求相关信息:
def initial(self, request, *args, **kwargs):"""Runs anything that needs to occur prior to calling the method handler."""self.format_kwarg = self.get_format_suffix(**kwargs)# Perform content negotiation and store the accepted info on the requestneg = self.perform_content_negotiation(request)request.accepted_renderer, request.accepted_media_type = neg# Determine the API version, if versioning is in use.version, scheme = self.determine_version(request, *args, **kwargs)request.version, request.versioning_scheme = version, scheme# Ensure that the incoming request is permitted# 实现认证self.perform_authentication(request)# 检查权限self.check_permissions(request)self.check_throttles(request)
2、check_permissions()
def check_permissions(self, request):"""Check if the request should be permitted.Raises an appropriate exception if the request is not permitted.(检查是否应该允许请求。如果不允许请求,则引发适当的异常)"""# 权限列表,self.get_permissions() = MyPermission(),调用其中的 has_permission() 方法for permission in self.get_permissions():if not permission.has_permission(request, self):self.permission_denied(request, message=getattr(permission, 'message', None))
从上面可以看到其实权限认证,主要是调用 has_permission()
方法,若我们自定义权限类,只需实现这个方法即可。
self.get_permissions()
其本质是在定义权限类对象列表:[MyPermission(), ]
,具体可见 3
- 若
has_permission()
返回 True,即有权限访问,则不执行self.permission_denied()
- 若访问 False,即无权访问,则执行
self.permission_denied()
,在其中返回的错误信息就是message
所定义的,因此我们也可以自定义message
的内容。
3、get_permissions()
def get_permissions(self):"""Instantiates and returns the list of permissions that this view requires.实例化并返回此视图所需的权限列表。"""# permission_classes = [MyPermission, ],返回对象列表return [permission() for permission in self.permission_classes]
源码流程图
总结
- 自定权限类,需继承
BasePermission
- 类中必须实现
has_permission()
方法 - 全局定义权限(可设置 settings),局部视图类不设置权限认证,可设置
permission_classes = []
转载于:https://www.cnblogs.com/midworld/p/11075977.html
rest framework 权限相关推荐
- REST framework 权限管理源码分析
REST framework 权限管理源码分析 同认证一样,dispatch()作为入口,从self.initial(request, *args, **kwargs)进入initial() def ...
- cognos java用户权限_Cognos 权限管理之第三方目录管理员器、报表服务器权限管理、FrameWork权限管理等详细配置 【39页深度好文图文并茂带你全面了解Cognos权限管理】...
一.引言 1.1. 编写目的 本文档是结合以往的开发经验,从实际报表开发出发,详细介绍了ReportNet报表设计流程.开发技巧,报表性能调优.FM建模规范及技巧讲解.总结的文档希望对大家在日后的开发 ...
- Zend Framework——权限控制与认证
Zend Framework Acl与Auth--权限控制与认证 Created with Raphaël 2.1.2 认证开始 登录 发送用户名,密码及数据库连接 校验工作 结果处理 认证结束 步骤 ...
- linux编程参数列表,Linux编程 14 文件权限(用户列表passwd,用户控制shadow,useradd模板与useradd命令参数介绍)...
一. 概述 linux安全系统的核心是用户账户. 创建用户时会分配用户ID(UID). UID是唯一的,但在登录系统时不是用UID,而是用登录名.在讲文件权限之之前,先了解下linux是怎样处理用户账 ...
- 网站程序IIS布署问题备忘录
通常站点配置到IIS中经常会遇到一些问题: 1. 出错提示:"无法找到XXX程序集依赖项或无权限访问XXX程序集" 解决办法:.net framework权限不够, C:\wind ...
- c#生成token访问的接口_python测试开发django60.token登录(TokenAuthentication)
前言 现在很多接口项目在登录的时候返回一个token,登录后的拿着这个token去访问访问登录之后的请求. 本篇使用djangorestframework框架写一个登陆的接口,登录成功后返回token ...
- 博客园2013年4月底至5月初源码发布详情
口腔门诊会员病历管理源码 2013-5-3 [VS2010]功能介绍: 1.系统采用经典三层架构开发开发工具vs2010+sql2005 完全开源.2.主要功能:会员添加 会员管理 会员充值.消费 ...
- mac 如何恢复python_mac python 升级 和 恢复
最新 python 下载地址 安装后 运行 python --version 还是没变 是因为python 安装的路径是/Library/Frameworks/Python.framework ,而系 ...
- Permissions
权限 (Permissions) 认证或识别本身通常不足以获得对信息或代码的访问.为此,请求访问的实体必须具有授权.-- Apple 开发人员文档 与身份验证和限流一起,权限确定是否应该授予或拒绝访问 ...
- pythonDjango后端笔记
文章目录 软件开发架构 纯手撸web框架 借助于wsgiref模块 动静态网页 模块语法之Jinja2模块 自定义简易版本web框架请求中各个模块的作用 python3大主流web框架 注意事项 Dj ...
最新文章
- CVPR2020:三维实例分割与目标检测
- Piranha实验总结
- java 存放大数字_我可以使用什么变量类型在java中保存大量数字(30位数)?
- 获取笔记本的SHA1的值。
- python3-开发进阶-RESTful 软件架构风格
- Java进阶之光!mysql创建用户并授权建表
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第3篇]影响计算能力和存储能力的因素
- nginx php pathinfo,Nginx解决PATH_INFO新解决办法
- Linux文件(目录)命名规则
- 有关i++问题,和一些另外的易错点
- MySQL数据库左右连接
- windows核心编程之 C/C++运行库注意事项
- android 电话管理
- win7设置电脑保护眼睛颜色(终极方法,提供两种颜色选择)
- 图的存储结构之边集数组
- Docker的中央仓库
- Java项目:医院管理系统(java+SSM+layui+maven+mysql)
- xlwt/xlrd库的区别
- 肝完这篇 TCP/IP ,我就去面试去。
- 多因子选股Alpha策略
热门文章
- 20220729梦笔记
- JDK8的shenandoah GC/zgc啥时能转正?
- You specified a pre-MSA CPU in your CFLAGS
- AV_PIX_FMT_YUV420P12LE’在此作用域中尚未声明
- 昨天跟朋友聊天谈技术工作,竟然吹了4个小时
- 热烈庆贺本博客9级及排名138
- 晚间看图片就高亮,这体验太差
- 空中照片:云层透过的阳光,双机同飞
- C++/CLI C#字符串转为C++字符串正确写法
- android json 解析 arraylist,android – 将ArrayList转换为JSONArray