django - django 休息模型权限
问题描述
我正在使用 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子类化以使用该权限,如文档中所述
编辑:
在 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: 有一个功能请求提交来支持这一点。
推荐阅读
- google-drive-api - 如何获取google drive api文件夹中所有子文件夹中具有特定扩展名的所有文件的列表?
- azure-ad-b2c - 有没有办法从 url 设置 JwtIssuer id_token_lifetime_secs
- php - How to display background image using PHP/CSS
- arrays - 如何在 VBA 中的 .body 上使用集合项?
- python - 试图在这个单行循环中增加 Y
- php - CSV 导入将 < 和 > 替换为 _
- java - 验证后缀表达式而不进行评估
- html - 限制 Blogger 上每个标签的帖子数量
- javascript - WordPress 锚点点击 JavaScript 打开详情
- firebase - 无法在 Firebase 功能响应上设置 Content-Disposition