【问题标题】:Setting different permission classes for POST and GET while using djangorestframework's default router在使用 djangorestframework 的默认路由器时为 POST 和 GET 设置不同的权限类
【发布时间】:2020-05-04 00:30:30
【问题描述】:

我只是在看一些关于如何使用 Django Rest Framework 使用其默认路由器创建基本 REST API 的在线教程。 Link to Docs

但是因为他使用了模型视图集,所以他必须向它们添加权限类,这意味着所有不同类型的请求,无论是 post 或 get 还是其他请求,都将采用相同的权限。

我想知道是否有办法根据请求的类型给他们不同的权限等级。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    是的,您可以编写自己的权限。 只需创建一些python文件。我将其命名为 permissions.py:

    from rest_framework.generics import get_object_or_404
    from rest_framework.permissions import BasePermission
    from company.models import Company
    
    
    class IsGetOrIsAuthenticated(BasePermission):
        def has_permission(self, request, view):
            if request.method == 'GET':
                return True
            return request.user and request.user.is_authenticated
    
    
    class IsGetOrIsCompanyOwner(BasePermission):
        def has_permission(self, request, view):
            if request.method == 'GET' or 'OPTIONS':
                return True
            elif request.method == 'DELETE':
                company = get_object_or_404(Company, id=view.kwargs['pk'])
                return request.user.user_type == 'moder' or company.owner == request.user
            else:
                company = get_object_or_404(Company, id=view.kwargs['pk'])
                return company.owner == request.user or request.user.user_type == 'moder'
    
    
    class IsModer(BasePermission):
        def has_permission(self, request, view):
            return request.user.user_type == 'moder'
    

    之后你可以在views.py中使用它们

    from company.permissions import IsGetOrIsAuthenticated, IsGetOrIsCompanyOwner, IsModer
    
    class ActiveCompanyShortView(ModelViewSet):
        authentication_classes = (TokenAuthentication,)
        permission_classes = (IsGetOrIsAuthenticated,)
    

    你可以阅读更多there

    【讨论】:

    • 这完全符合我的要求,但 Django 不提供 isAuthenticatedOrReadOnly 是否足够好?
    • 是的,它会起作用的。但是使用isAuthenticatedOrReadOnly后,每个人都可以更新。例如,您有自己的公司。如果您将使用 isAuthenticatedOrReadOnly 权限。系统中经过身份验证的每个用户都可以更新甚至删除您的公司。编写自己的权限可以帮助您避免此问题
    【解决方案2】:

    要实现您的需要,一种可能的解决方案是覆盖 get_permissions()ViewSet

    def get_permissions(self):
            """
            Instantiates and returns the list of permissions that this view requires.
            """
            if self.action == 'list':
                return [objects of permissions_u_need_in_list_view]
    
            elif self.action == 'create':
                return [objects of permissions_u_need_in_create_view]
    

    这就是 DRF 提供的get_permissions() 的定义。

    def get_permissions(self):
            """
            Instantiates and returns the list of permissions that this view requires.
            """
            return [permission() for permission in self.permission_classes]
    

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      相关资源
      最近更新 更多