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
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
2
3
4
5
上次更新: 2024/3/13 15:35:10