我怎样才能使“has_object_permission()”工作?

时间:2021-05-06 10:52:45

标签: python django rest django-rest-framework user-permissions

我正在尝试为用户创建对象级权限。我的ddbb模型的结构如下:

  • 教师拥有教室 (id_teacher ForeignKey)
  • 一个教室拥有一些学生 (id_classroom ForeignKey)

我想让拥有学生注册教室的老师可以访问学生信息。

这里是API代码和权限代码:

class StudentAPI(RetrieveUpdateAPIView):
    permission_classes = [GetStudentPermission, ]

    def get(self, request):
        student_ = Student.objects.get(username=request.GET['username'])
        s_student_ = StudentSerializer(student_)
        return Response(s_student_.data)
class GetStudentPermission(BasePermission):
    message = 'La información de este estudiante está restringida para usted'

    def has_object_permission(self, request, view, obj):
        cls_ = Classroom.objects.filter(id=obj.id_classroom.id).first()
        tch_ = Teacher.objects.get(classroom=cls_)
        user_ = User.objects.get(id=tch_.id_user.id)
        return bool(user_ == request.user)

似乎权限课程根本不起作用,因为我可以访问使用任何用户帐户注册的每个学生的信息。 先谢谢了

1 个答案:

答案 0 :(得分:0)

根据 Custom permissions [DRF docs] 部分中的注释:

<块引用>

实例级的logging.basicConfig( filename='yourlogfile.log', level=logging.INFO, ... ) 方法只会被调用 如果视图级 has_object_permission 检查已经通过。还 请注意,为了运行实例级检查,视图代码 应该显式调用 has_permission。如果 您正在使用通用视图,那么这将由 默认。 (基于函数的视图需要检查对象权限 明确地,在失败时引发 .check_object_permissions(request, obj)。)

由于您覆盖 PermissionDenied 并自己实现它,get 永远不会被调用,因此您可以自己实现:

check_object_permissions

或者更好的是,您的 get 实现与 class StudentAPI(RetrieveUpdateAPIView): permission_classes = [GetStudentPermission, ] def get(self, request): student_ = Student.objects.get(username=request.GET['username']) self.check_object_permissions(self.request, student) s_student_ = StudentSerializer(student_) return Response(s_student_.data) 已有的内置实现没有太大区别,因此您可以放弃覆盖 RetrieveUpdateAPIView 并实际直接使用视图:

get