不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • python基础

  • python模块

  • django

  • flask

  • SYL

    • day01

    • day02

    • day03

    • day04

    • day05

    • day06

    • day07

    • day08

    • day09

      • 01.RBAC角色权限管理类
      • 02.课程播放接口权限限制2
        • 03.路径模板两张表设计
        • 04.路径页面接口开发
      • day10

      • day11

      • day12

    • Celery

    • 微服务

    • python
    • SYL
    • day09
    xiaonaiqiang
    2021-03-10
    目录

    02.课程播放接口权限限制2

    # 1.重写django权限

    # 1.1syl/utils/authentication.py重写权限模块

    # -*- coding: utf-8 -*-
    from rest_framework.permissions import BasePermission
    from rest_framework import exceptions
    import re
    from course.models import UserCourse
    
    # 自定义权限(局部)
    class MyPermission(BasePermission):
        # has_permission 是用户对这个视图有没有 GET POST PUT PATCH DELETE 权限的分别判断
        def has_permission(self, request, view):
            print('has_perm')
            # print(view.kwargs.get("pk"), request.user.id)
            """判断用户对模型有没有访问权"""
            # 任何用户对使用此权限类的视图都有访问权限
            if request.user.is_superuser:
                # 管理员对用户模型有访问权
                return True
            elif view.kwargs.get('pk') == str(request.user.id):
                # 携带的id和用户的id相同时有访问权
                return True
            return False
    
        # has_object_permission 是用户过了 has_permission 判断有权限以后,再判断这个用户有没有对一个具体的对象有没有操作权限
        # 这样设置以后,即使是django admin管理员也只能查询自己user标的信息,不能查询其他用户的单条信息
        def has_object_permission(self, request, view, obj):
            # 判断当前用户是否有访问 /course/sections/1/ 接口权限
            course_detail_url = re.match('/course/sections/(\d+)/$', request.path_info)
            if course_detail_url:
                user = request.user
                course = obj.chapters.course
                has_video_rights = self.video_rights(user,course)
                return has_video_rights
            return True
    
        # 对用户是否有课程播放权限进行验证
        @staticmethod
        def video_rights(user,course):
            '''
            :param user: 当前登录用户
            :param course: 用户要播放的课程对象
            :return: 返回True有权限,否则出发异常
            '''
            # 1.免费课程直接返回True
            # 2.会员免费课程,判断当前用户是否是会员,如果是会员返回True
            # 3.付费课程,判断当前用户在UserCourse表中有购买记录返回True
            try:
                is_buy = UserCourse.objects.get(course=course, user=user)
                return True
            except Exception as e:
                raise exceptions.ParseError('没卖课程播放个毛线!头给你打扁!')
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50

    # 2.添加视频播放接口权限

    # 2.1 course/urls.py中添加路由

    router.register(r'sections', views.SectionsViewSet)
    
    1

    # 2.2 course/views.py中使用自定义权限

    from utils.authentication import MyPermission
    class SectionsViewSet(viewsets.ModelViewSet):
        queryset = Sections.objects.all()
        serializer_class = SectionsSerializer
        permission_classes = (MyPermission,)
    
    1
    2
    3
    4
    5
    上次更新: 2024/3/13 15:35:10
    01.RBAC角色权限管理类
    03.路径模板两张表设计

    ← 01.RBAC角色权限管理类 03.路径模板两张表设计→

    最近更新
    01
    04.数组双指针排序_子数组
    03-25
    02
    08.动态规划
    03-25
    03
    06.回溯算法
    03-25
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式