【问题标题】:Object level authorization in a Django Rest Framework viewsetDjango Rest Framework 视图集中的对象级授权
【发布时间】:2020-04-03 10:04:01
【问题描述】:

我正在使用 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)

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

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

【问题讨论】:

    标签: django django-rest-framework django-views django-permissions


    【解决方案1】:

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

    • name=XXX-list/XXX/
      • list :通过get_queryset()过滤的权限
      • create :通过 rules使用serializer 进行有效负载验证的权限
    • name=XXX-detail : /XXX/{id}
      • retrieve :通过get_queryset()过滤的权限
      • partial_updateupdatedestroy :通过 rulesget_queryset() 过滤的权限

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

    【讨论】:

    • 谢谢。似乎它会解决我的问题。
    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2018-06-25
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多