Каков наилучший подход к достижению многопользовательского доступа в Django?
Я использую django в качестве сервера API (используя DRF) и административной панели с Postgres DB. Проблема в том, что у меня будет несколько арендаторов и я хочу следовать полному разделению потоков. Данные от одного арендатора не должны быть каким-либо образом доступны другому.
Пример сценария: Допустим, у меня есть несколько институтов в качестве клиентов, и каждый институт будет иметь всех своих студентов на моей платформе. Ни один институт не должен иметь доступ к данным другого.
Я могу предложить 2 подхода:
1. Расширяя ModelAdmin для страниц администратора и для API, я могу получить арендатора, связанного с конкретным пользователем, из запроса.
При таком подходе мне придется проверять наличие арендатора пользователя в каждом классе 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)
И придется делать это аналогично в методах list, create, update и destroy класса ModelViewSet при создании API
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/
Пожалуйста, предложите, какой подход будет лучше из двух вышеперечисленных, и есть ли какой-либо лучший подход для этого.
Примечание: Это требование хранить все данные всех клиентов в одной БД в одной схеме.