我使用 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中。