【发布时间】: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