我正在使用Django Rest Framework(DRF)创建一个API,想知道应该在哪里处理对象级授权。
到目前为止,我已经创建了一个Organization
模型和一个自定义用户模型,其中电子邮件是唯一标识符而不是用户名。组织和用户当前通过多对多字段进行连接。
我想做的是确保当用户点击我的API时,他们只能对链接到用户各自组织的模型执行标准的CRUD操作。例如,这是我当前的示例,这里我UserViewSet
覆盖了thenget_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
文件中,并在替代操作中调用它们。我是否应该将这些检查转移给自定义权限?还是应该完全忽略视图并将验证放入序列化器中?
实际上,您需要不同的工具来执行不同的DRF CRUD操作。我个人很喜欢使用rules
包裹
name=XXX-list
: /XXX/
list
:通过过滤权限get_queryset()
create
:通过权限rules
和有效负载验证serializer
name=XXX-detail
: /XXX/{id}
retrieve
:通过过滤权限get_queryset()
partial_update
,update
和destroy
:权限通过rules
和get_queryset()
过滤您可能需要编写一个自定义DjangoObjectPermission
类以进行集成rules
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句