Django Rest Framework视图集中的对象级别授权

P4nd4b0b3r1n0

我正在使用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文件中,并在替代操作中调用它们。我是否应该将这些检查转移给自定义权限?还是应该完全忽略视图并将验证放入序列化器中?

蒂莫西·德里昂(TimothéDelion)

实际上,您需要不同的工具来执行不同的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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用于视图集中视图的Django Rest Framework自定义架构

Django Rest Framework:在视图集中传递上下文

如何在Django Rest Framework的视图集中渲染为html

Django rest框架无法处理模型视图集中的多个对象

如何使用Django Rest Framework视图集按父对象的属性过滤嵌套数据

Django REST Framework:视图和视图集之间的区别?

Django Rest Framework-在同一个视图集中返回不同的序列化器

无法扩展Django REST Framework视图集以处理多级API

Django Rest Framework - 单元测试视图集额外操作

如何在Django Rest Framework中动态更新视图集

Django Rest Framework具有针对同一对象的多个视图集和路由器

django rest框架-使用视图集

测试Django REST视图集的POST方法

PyCharm:调试Django Rest视图集

POST上的Django Rest Framework对象级别权限

通用外键字段模型中的Django Rest Framework search_fields视图集

如何为 Django Rest Framework 中的视图集的自定义操作编写测试

django-rest-framework自定义视图集与多个查找参数检索

如何在Django Rest Framework中更改视图集检索响应?

分页不适用于Django rest_framework中的视图集

使用rest_framework_jwt在Django 3.0.3中从没有视图集的简单API调用获取用户对象

设计基于Django Rest Framework角色的授权

在Django Rest框架中使用视图集进行过滤

基于方法的Django Rest框架视图集权限

如何使用 django rest 视图集执行多次插入?

Django Rest Framework的ModuleNotFoundError

Django Rest Framework 视图集 - 基于用户名问题的外键过滤过滤器

Rest Framework 视图之外的 Django Rest Framework 权限

使用flaggit定义Django Rest Framework视图