首页 > 解决方案 > django 休息模型权限

问题描述

我正在使用 Django 2.1 和 djangorestframework 3.9.2。我希望能够通过 Django 管理界面控制对 Django 模型对象的 REST 操作的访问,最好使用用户权限。例如,只有对模型对象 Foo 具有读取权限的用户才能在我的 REST API 中看到 Foo。

我阅读了文档,似乎我可以使用DjangoModelPermissionsDjangoObjectPermissions

但是,当我清除数据库中的所有用户权限并将 DEFAULT_PERMISSIONS_CLASS 设置为 DjangoModelPermissions 或 DjangoObjectPermissions 时,我仍然能够在 REST API 中看到内容。这意味着缺乏权限并不能阻止我看到我希望的对象。

示例设置:

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

一个示例对象视图:

from rest_framework import routers, serializers, viewsets
from .models import Example

class ExampleSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Example
        fields = '__all__'

class ExampleViewSet(viewsets.ModelViewSet):
    queryset = Example.objects.all()
    serializer_class = ExampleSerializer

router = routers.DefaultRouter()
router.register(r'examples', ExampleViewSet)

建议?

标签: djangodjango-rest-framework

解决方案


DjangoModelPermissions 只执行数据修改的权限规则(对于POSTPUTPATCHDELETE请求),但不执行数据查看的权限规则。

要限制数据查看,您可以添加自定义视图权限,并将DjangoModelPermissions子类化以使用该权限,如文档中所述

编辑:

在 Django 2.1 中,添加了视图模型权限。所以这可能会在未来的版本中被DjangoModelPermissions支持,但在那之前,你可以尝试像这样子类化 DjangoModelPermissions 来添加查看权限检查:

class DjangoModelPermissionsWithRead(DjangoModelPermissions):
    perms_map = {
        'GET': ['%(app_label)s.view_%(model_name)s'],
        'OPTIONS': [],
        'HEAD': [],
        'POST': ['%(app_label)s.add_%(model_name)s'],
        'PUT': ['%(app_label)s.change_%(model_name)s'],
        'PATCH': ['%(app_label)s.change_%(model_name)s'],
        'DELETE': ['%(app_label)s.delete_%(model_name)s'],
    }

编辑 2: 有一个功能请求提交来支持这一点


推荐阅读