【问题标题】:Django Admin permissions applied on REST API views应用于 REST API 视图的 Django 管理员权限
【发布时间】:2020-05-02 10:13:23
【问题描述】:

在 django 管理界面中,可以为每个单独的模型指定权限。示例模型 Customer 的权限选项是:

  • 可以添加客户
  • 可以更换客户
  • 可以删除客户
  • 可以查看客户

但是,这些权限似乎不适用于 REST Framework API 视图 (rest_framework.viewsets.ModelViewSet),为 Customer 实现如下:

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

我认为通过将 DEFAULT_PERMISSION_CLASSES 设置为 DjangoModelPermissions 可以反映这些权限,但事实并非如此:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

管理员中定义的权限是否应该在这些设置中也适用于视图,不应该,和/或有什么方法可以做到这一点?好处是系统管理员可以轻松地在管理界面中定义组,并针对他们的问题区域定制他们的权限,因此能够以这种方式定义权限是非常可取的。我见过许多其他实现权限的方法,但它们需要我在 python 中的视图定义上看到很多自定义。

版本:

  • Django 2.2.9
  • djangorestframework 3.11.0
  • djangorestframework-simplejwt 4.4.0

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    对于检查组和权限的 API 视图,我们可以在我们的 views.py 中使用 DjangoModelPermission,如下所示。

    from rest_framework.permissions import DjangoModelPermissions
    
    class CustomerViewSet(viewsets.ModelViewSet):
        queryset = Customer.objects.all()
        serializer_class = CustomerSerializer
        permission_classes = (DjangoModelPermissions, )
    

    它限制 POST、PUT 和 DELETE 访问,但允许 GET 访问。也限制它

    from rest_framework.permissions import DjangoModelPermissions
    
    class CustomDjangoModelPermissions(DjangoModelPermissions):
        def __init__(self):
            self.perms_map['GET'] = ['%(app_label)s.view_%       (model_name)s']
    
    
    class CustomerViewSet(viewsets.ModelViewSet):
        queryset = Customer.objects.all()
        serializer_class = CustomerSerializer
        permission_classes = (CustomDjangoModelPermissions, )
    

    【讨论】:

    • 太棒了!我不知道它允许 GET 访问,所以这就是我感到困惑的原因。使用您的确切代码,我得到了一个类似return [perm % kwargs for perm in self.perms_map[method]] - not enough arguments to format string 的错误,但能够让它与这个答案一起工作:stackoverflow.com/questions/55504648/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多