【问题标题】:check permissions before perform_create() method applied在应用 perform_create() 方法之前检查权限
【发布时间】:2020-10-14 04:47:34
【问题描述】:

我需要为请求用户的不同类型的操作检查不同类型的权限。例如get 权限只需要[IsAuthenticated] 但当用户请求perform_create 方法时。我想实现另一个权限是CanCreateProject permissions.py

class CanCreateProject(permissions.BasePermission):  
  def has_object_permission(self, request, view, obj):
    if request.user.is_superuser:
        return True
    else:
      return request.user.profile_limitation.can_create_project
    

views.py

class ProjectView(ModelViewSet):
  serializer_class = ProjectSerializer
  permission_classes = [IsAuthenticated]

  def get_queryset(self):
    queryset = Project.objects.all()
    organization = self.request.user.organization
    query_set = queryset.filter(organization=organization)    
    return query_set
  
  def perform_create(self, serializer):
    
    self.permission_classes = [CanCreateProject] ## here

    project = self.request.data["project_name"]
    path = self.request.data["project_name"]
    organization = self.request.data["organization"]
    serializer.save(project_name=project, project_path=path, organization=organization)

我怎样才能运行CanCreateProject 方法,只为请求perform_create 方法。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    覆盖 get_permissions(...) 方法

    class ProjectView(ModelViewSet):
        serializer_class = ProjectSerializer
        permission_classes = [IsAuthenticated]
    
        def get_queryset(self):
            queryset = Project.objects.all()
            organization = self.request.user.organization
            query_set = queryset.filter(organization=organization)
            return query_set
    
        def get_permissions(self):
            if self.action == 'create':
                composed_perm = IsAuthenticated & CanCreateProject
                return [composed_perm()]
    
            return super().get_permissions()
    
        # def perform_create(self, serializer):
        #     self.permission_classes = [CanCreateProject]  ## here
        # 
        #     project = self.request.data["project_name"]
        #     path = self.request.data["project_name"]
        #     organization = self.request.data["organization"]
        #     serializer.save(project_name=project, project_path=path,
        #                     organization=organization)

    注意事项:

    更新-1

    您应该实现 Permission 类的 has_permission(..) 方法,而不是 has_object_permission(...) 方法

    from rest_framework import permissions
    
    
    class CanCreateProject(permissions.BasePermission):
        def has_permission(self, request, view):
            if request.user.is_superuser:
                return True
            else:
                return request.user.profile_limitation.can_create_project

    【讨论】:

    • 感谢您的回答。所以,我只需要将perform_create 的内部放入if self.action == 'create'
    • 呃……我不明白。我的答案将按原样工作
    • 抱歉之前的评论不清楚,最后没有检查权限。只是在未经许可的情况下创建项目。就像get_permission() 没有被覆盖
    • 如果 self.action 是 createperform_create() 将被调用 /b>(我希望给定的视图是完整的)。
    • 谢谢它现在正在工作。我想我需要检查has_permissionhas_object_permission 之间的区别顺便说一句,您应该从 has_permission() 类中删除obj,它不需要一个。再次感谢。
    猜你喜欢
    • 2021-07-02
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2016-07-02
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多