【问题标题】:DRF ViewSet operation authorization with rules带规则的 DRF ViewSet 操作授权
【发布时间】:2020-04-21 06:37:57
【问题描述】:

考虑以下模型

class MyUser(AbstractBaseUser):
    ADMIN = 0
    TEACHER = 100
    STUDENT = 200
    UNSPECIFIED = 256

    USER_TYPE_CHOICES = (
        (ADMIN, 'admin'),
        (TEACHER, 'teacher'),
        (STUDENT, 'student'),
        (UNSPECIFIED, 'unspecified')
    )
    ...
    user_type = models.IntegerField(db_column='userType', choices=USER_TYPE_CHOICES, blank=True, default=UNSPECIFIED)

还有下面的ViewSet

class CourseViewSet(ViewSet):

    def create(self, request):
        serializer = CourseSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

使用django-rules,如何将CourseViewSet中的create()操作限制为只有user_type TEACHER的用户?

【问题讨论】:

    标签: python security django-rest-framework authorization django-rules


    【解决方案1】:

    如果您想自动应用模型中定义的权限,您可以使用

    在你的课程模型中是这样的

    from rules import predicates
    
    @predicates.predicate()
    def check_teacher(user):
        if not hasattr(user, 'user_type'):
            return False
    
        if user.user_type == 'teacher':
            return True
    
        return False
    
    
    class Course(models.Model):
        ....
        class Meta:
            rules_permissions = {
                "add": check_teacher,
                "read": rules.always_allow,
            }
    

    你的看法

    from rules.contrib.rest_framework import AutoPermissionViewSetMixin
    
    class CourseViewSet(AutoPermissionViewSetMixin, viewsets.ViewSet):
        def get_queryset(self):
            return Course.objects.all()
    
        def create(self, request):
            serializer = CourseSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=201)
            return Response(serializer.errors, status=400)
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2019-03-03
      • 2011-09-25
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多