gpt4 book ai didi

django - Django Rest Framework View 集中的对象级授权

转载 作者:行者123 更新时间:2023-12-04 04:14:31 26 4
gpt4 key购买 nike

我正在使用 Django Rest Framework (DRF) 创建一个 API,想知道应该在哪里处理对象级授权。

到目前为止,我已经创建了一个 Organization 模型和一个自定义用户模型,其中电子邮件是唯一标识符而不是用户名。组织和用户目前通过多对多字段连接。

我想做的是确保当用户点击我的 API 时,他们只能对链接到用户各自组织的模型执行标准 CRUD 操作。作为示例,这是我当前的 UserViewSet ,我在其中重写了 get_queryset 方法来过滤 User 查询集以仅返回除以下内容之外的其他用户与调用 API 的用户相同的组织:

class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer

def get_queryset(self):
User = get_user_model()
user = self.request.user
organizations = user.organization.all()
return User.objects.filter(organization__in=organizations)

将这些限制扩展到其他 View 集操作的最佳做​​法是什么?例如,如果我想确保用户只能创建其他用户并将其添加到他们链接到的组织中,我是否应该重写 View 集中的 create 方法并在那里执行验证请求数据中传入的组织与调用API的用户所属组织是否相同?

我的直觉是我最终会以这种方式打破 DRY,因为我会覆盖所有 View 集操作并重复几乎相同的覆盖。这个直觉错了吗?我想我可以将“验证”分离到一个单独的 services.py 文件中,并在覆盖的操作中调用它们。我是否应该将这些检查卸载到自定义权限?或者我应该完全忽略 View 并将验证放入序列化程序中?

最佳答案

实际上,您需要针对不同的 DRF CRUD 操作使用不同的工具。就个人而言,我喜欢使用 rules包裹

  • name=XXX-list :/XXX/
    • list :通过get_queryset()过滤
    • 的权限
    • create :通过规则的权限和使用serializerpayload验证<
  • name=XXX-detail:/XXX/{id}
    • retrieve : 通过get_queryset() 过滤权限
    • partial_updateupdatedestroy :通过 rulesget_queryset()过滤

您可能需要编写自定义 DjangoObjectPermission 类来集成规则

关于django - Django Rest Framework View 集中的对象级授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61009405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com