一、权限示例

需求:不同的用户类型有不同的权限

  • 普通用户:只能查看个人信息相关,序号: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 权限相关推荐

  1. REST framework 权限管理源码分析

    REST framework 权限管理源码分析 同认证一样,dispatch()作为入口,从self.initial(request, *args, **kwargs)进入initial() def ...

  2. cognos java用户权限_Cognos 权限管理之第三方目录管理员器、报表服务器权限管理、FrameWork权限管理等详细配置 【39页深度好文图文并茂带你全面了解Cognos权限管理】...

    一.引言 1.1. 编写目的 本文档是结合以往的开发经验,从实际报表开发出发,详细介绍了ReportNet报表设计流程.开发技巧,报表性能调优.FM建模规范及技巧讲解.总结的文档希望对大家在日后的开发 ...

  3. Zend Framework——权限控制与认证

    Zend Framework Acl与Auth--权限控制与认证 Created with Raphaël 2.1.2 认证开始 登录 发送用户名,密码及数据库连接 校验工作 结果处理 认证结束 步骤 ...

  4. linux编程参数列表,Linux编程 14 文件权限(用户列表passwd,用户控制shadow,useradd模板与useradd命令参数介绍)...

    一. 概述 linux安全系统的核心是用户账户. 创建用户时会分配用户ID(UID). UID是唯一的,但在登录系统时不是用UID,而是用登录名.在讲文件权限之之前,先了解下linux是怎样处理用户账 ...

  5. 网站程序IIS布署问题备忘录

    通常站点配置到IIS中经常会遇到一些问题: 1. 出错提示:"无法找到XXX程序集依赖项或无权限访问XXX程序集" 解决办法:.net framework权限不够, C:\wind ...

  6. c#生成token访问的接口_python测试开发django60.token登录(TokenAuthentication)

    前言 现在很多接口项目在登录的时候返回一个token,登录后的拿着这个token去访问访问登录之后的请求. 本篇使用djangorestframework框架写一个登陆的接口,登录成功后返回token ...

  7. 博客园2013年4月底至5月初源码发布详情

    口腔门诊会员病历管理源码  2013-5-3 [VS2010]功能介绍: 1.系统采用经典三层架构开发开发工具vs2010+sql2005 完全开源.2.主要功能:会员添加 会员管理 会员充值.消费 ...

  8. mac 如何恢复python_mac python 升级 和 恢复

    最新 python 下载地址 安装后 运行 python --version 还是没变 是因为python 安装的路径是/Library/Frameworks/Python.framework ,而系 ...

  9. Permissions

    权限 (Permissions) 认证或识别本身通常不足以获得对信息或代码的访问.为此,请求访问的实体必须具有授权.-- Apple 开发人员文档 与身份验证和限流一起,权限确定是否应该授予或拒绝访问 ...

  10. pythonDjango后端笔记

    文章目录 软件开发架构 纯手撸web框架 借助于wsgiref模块 动静态网页 模块语法之Jinja2模块 自定义简易版本web框架请求中各个模块的作用 python3大主流web框架 注意事项 Dj ...

最新文章

  1. CVPR2020:三维实例分割与目标检测
  2. Piranha实验总结
  3. java 存放大数字_我可以使用什么变量类型在java中保存大量数字(30位数)?
  4. 获取笔记本的SHA1的值。
  5. python3-开发进阶-RESTful 软件架构风格
  6. Java进阶之光!mysql创建用户并授权建表
  7. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第3篇]影响计算能力和存储能力的因素
  8. nginx php pathinfo,Nginx解决PATH_INFO新解决办法
  9. Linux文件(目录)命名规则
  10. 有关i++问题,和一些另外的易错点
  11. MySQL数据库左右连接
  12. windows核心编程之 C/C++运行库注意事项
  13. android 电话管理
  14. win7设置电脑保护眼睛颜色(终极方法,提供两种颜色选择)
  15. 图的存储结构之边集数组
  16. Docker的中央仓库
  17. Java项目:医院管理系统(java+SSM+layui+maven+mysql)
  18. xlwt/xlrd库的区别
  19. 肝完这篇 TCP/IP ,我就去面试去。
  20. 多因子选股Alpha策略

热门文章

  1. 20220729梦笔记
  2. JDK8的shenandoah GC/zgc啥时能转正?
  3. You specified a pre-MSA CPU in your CFLAGS
  4. AV_PIX_FMT_YUV420P12LE’在此作用域中尚未声明
  5. 昨天跟朋友聊天谈技术工作,竟然吹了4个小时
  6. 热烈庆贺本博客9级及排名138
  7. 晚间看图片就高亮,这体验太差
  8. 空中照片:云层透过的阳光,双机同飞
  9. C++/CLI C#字符串转为C++字符串正确写法
  10. android json 解析 arraylist,android – 将ArrayList转换为JSONArray