在 Django 中实现多租户的最佳方法是什么?

问题描述 投票:0回答:1

我使用 django 作为 API 服务器(使用 DRF)和带有 Postgres DB 的管理仪表板。问题是我将有多个租户,并且我想遵循完全的关注点分离流程。 来自一个租户的数据不应以任何方式被另一租户访问。

示例场景: 假设我有多个机构作为我的客户,每个机构的所有学生都会加入我的平台。任何机构都不应能够访问其他机构的数据。

我可以想到两种方法:

1。为管理页面和 API 扩展 ModelAdmin,我可以从请求中获取与特定用户关联的租户。

在这种方法中,我必须在每个 modelAdmin 类中检查用户的租户,并在

def get_queryset()
方法中获取过滤后的查询集

    def get_queryset(self, request):
        tenant = request.user.tenant  # using related_name of foreignkey
        queryset = Course.objects.filter(tenant_id=tenant)

并且在创建 API 时,必须在

list
类的
create
update
destroy
ModelViewSet
方法中执行类似操作

class CourseViewSet(viewsets.ModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer
    permission_classes = (DjangoModelPermissions,)

    def list(self, request, *args, **kwargs):
        tenant = request.user.tenant
        queryset = self.filter_queryset(self.get_queryset())
        queryset = queryset.filter(tenant__id=tenant)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    def create(self, request, *args, **kwargs):
        pass

    def update(self, request, *args, **kwargs):
        pass

    def destroy(self, request, *args, **kwargs):
        pass

2。使用 Postgres 提供的行级安全性

在这种方法中,所有过滤都将由 postgres 本身完成,但为了实现这一点,我必须创建一个设置 (postgres) 会话变量的中间件,以及在模型上启用/禁用此变量的机制。

有关此方法的更多信息可以在下面的链接中找到:

https://schinckel.net/2017/12/20/django-multitenancy-using-postgres-row-level-security/

请建议上述两种方法中哪种方法更好,以及是否有更好的方法。

注意:要求将同一个DB中所有客户端的所有数据保存在同一个Schema中。

django postgresql django-rest-framework multi-tenant row-level-security
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.