繁体   English   中英

Django DRF创建相关对象的权限

Django DRF permissions on create related objects

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我努力在Django REST框架上的对象创建上实施安全性。

基本上,我可以使用'has_object_permission'在对象级别实施安全性:登录的用户必须是该对象的所有者才能对其进行操作。 实际上,正如文档中所述,我缩小了查询集中的对象检索范围,因此得到了404而不是403。我认为这不是问题(甚至更好,因为它隐藏了对象的存在)

但是我不能成功地不允许另一个用户创建相关对象。

我使用ModelSerializer和ModelViewSet。

这是一些天真的片段:

models.py:

class Daddy(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Kiddy(models.Model):
    title = models.CharField(max_length=12)
    daddy = models.foreignKey(Daddy, on_delete=models.CASCADE)

serializers.py:

class KiddySerializer(serializers.ModelSerializer):
    class Meta:
        model = Kiddy
        fields = '__all__'

viewsets.py:

class KiddyViewSet(viewsets.ModelViewSet):
    serializer_class = KiddySerializer
    queryset = User.objects.none()

    permission_classes = (IsAuthenticated, IsOwner, )

    def get_queryset(self):
        dad_uuid = self.kwargs['dad']
        return Kiddy.objects.filter(daddy__pk=dad_uuid).filter(daddy__owner=self.request.user)

router.py:

router = routers.DefaultRouter()
router.register(r'dad', KiddyViewSet, base_name='kid')

urls.py:

path('api/<uuid:cv>/', include(router.urls))

使用这些网址访问对象: http://..../api/4ecddcdd-1c0a-4d0b-8254-b0c0d2607e6d/-- >列出所有孩子

http://..../api/4ecddcdd-1c0a-4d0b-8254-b0c0d2607e6d/1 --->对象小子

实际上,由于使用uuid,我得到了一些安全保障,这很难猜到...

Permissions.py:

class IsOwner(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `owner` attribute.
"""

def has_object_permission(self, request, view, obj):
    if request.user != obj.daddy.owner:
        return False
    else:
        return True

如果使用错误的所有者登录,则可以创建相关的Kiddy对象!

我想,我必须以“ has_permission”类型实现此权限。 但是我不知道如何访问那里的对象,因为参数是请求和查看...

在这里,他找到了解决方案。 但这根本不是通用的,因为我将需要对每个相关对象的自定义权限...我得到了很多! 在Django REST Framework中检查相关对象的权限

任何想法?

1 个回复

好的,我解决了这个问题:-)

正如我怀疑的那样,在Permissions.py中,我添加了以下“ has_permission”:

class IsOwnerParent(permissions.BasePermission):
    def has_permission(self, request, view):
        daddy = Daddy.objects.get(pk=view.kwargs['dad'])
        return daddy.owner == request.user

并将其添加到我的ModelViewSet类中:

class KiddyViewSet(viewsets.ModelViewSet):
    serializer_class = KiddySerializer
    queryset = User.objects.none()

    permission_classes = (IsAuthenticated, IsOwner, IsOwnerParent)

    def get_queryset(self):
        dad_uuid = self.kwargs['dad']
        return Kiddy.objects.filter(daddy__pk=dad_uuid).filter(daddy__owner=self.request.user)

因此,实际上,此处提供的解决方案在Django REST Framework中检查相关对象的权限确实有效。 实际上,它非常通用,因为我的许多对象都与“爸爸”对象有关。

实际上,现在检索对象列表的行为看起来更“正常”:我收到403错误而不是404错误。

我认为这种用例非常普遍:用户只能创建与其拥有的对象相关的对象,并且也只能更新和删除其拥有的对象。

但是也许可以做一个更好的方法?

1 使用DRF创建时创建相关对象

基本上,我试图在DRF的一个请求中创建带有实对象的对象,我认为这很简单。 在下面的示例中,我想创建一个包含多个RaceCar的Race 我研究过的研究和其他问题都表明以下方法应该有效,谁能告诉我出了什么问题? 当尝试从validated_data pop时,我正在获取racec ...

2 通过相关对象权限的 Django 权限

我对 Django 比较陌生,我正在寻找有关如何以某种方式设置权限的一些指导。 基本上,我有一个应用程序,它由几个与此类似的模型组成: 我的想法是,如果用户被“分配”到一个项目(通过 M2M 字段),该用户将有权访问与该项目相关的所有资产和任务。 我已经查看了django-guardian的每个 ...

3 DRF和Django过滤器-过滤相关对象

我有两个模型: 两者都有序列化器: 现在,我需要一个端点,该端点将返回一个JSON,其中包含用户列表以及每个用户的相关注释。 这里的技巧是能够按日期范围过滤那些笔记。 我想这个URL看起来像这样: 转换为:“给我所有用户列表,以及其相关注释以及带有时间戳的时间戳, ...

7 DRF中相关模型之间的权限继承

我有3个类似波纹管的模型: 这里的想法是用户可以发布许多PropertyPost,而每个PropertyPost可以包含许多图像。 一切正常。 我的问题是在许可中。 我为PropertyPostDetail视图设置了一组权限,如下所示,而对ImageDetail视图没有设置权限 ...

9 在Django中创建相关对象

我有一个与另一个模型Product相关的模型Inventory 每当创建“产品”时,我也要创建“库存”的空白条目。 我怎样才能做到这一点? Views.py ...

10 组织与常规Django和DRF相关的代码

我有一个由Django驱动的网站,以及一个用于将数据传递到外界(例如Android)的Django REST Framework(DRF)Api。 经过研究,我得出的结论是,不应将REST框架的端点用于呈现常规Django模板(用于呈现网站本身)。 因此,对于相同的ORM模型集合,我有两组U ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM