我正在使用Django 2.1和djangorestframework 3.9.2。我希望能够通过Django管理界面控制Django模型对象对REST操作的访问,最好使用用户权限。例如,只有对模型对象Foo具有读取权限的用户才能在我的REST API中看到Foo。
我阅读了文档,似乎可以使用DjangoModelPermissions或DjangoObjectPermissions了。
但是,当我清除数据库中的所有用户权限并将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)
有什么建议吗?
DjangoModelPermissions仅强制执行用于数据修改的权限规则(用于POST,PUT,PATCH和DELETE请求),而不强制执行用于数据查看的权限规则。
要限制数据查看,您可以添加自定义视图权限,并子类DjangoModelPermissions使用该权限,如docs中所述
编辑:
在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'],
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句