Django-арендаторы: Ограничение доступа к публичной схеме
Я пытаюсь создать приложение для нескольких арендаторов (с общей базой данных и изолированной схемой), используя этот Django-Tenants пакет.
And I've followed the example videos to setup a demo: video1 and video2
клиенты приложений (models.py)
from django.db import models
from django_tenants.models import TenantMixin, DomainMixin
class Client(TenantMixin):
name = models.CharField("Customer name", max_length=100)
created_on = models.DateField(auto_now_add=True)
# default true, schema will be automatically created and synced when it is saved
auto_create_schema = True
class Domain(DomainMixin):
pass
app sweet_tenant (models.py)
from django.db import models
from applications.sweet_shared.models import SweetType
class Sweet(models.Model):
sweet_type = models.ForeignKey(SweetType, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
price = models.DecimalField(default=0, decimal_places=3, max_digits=8)
def __str__(self):
return self.name
app sweet_shared (models.py)
from django.db import models
class SweetType(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return self.name
настройки
# Application definition
SHARED_APPS = [
"django_tenants", # mandatory
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# shared apps
"applications.clients",
"applications.sweet_shared",
]
TENANT_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# your tenant-specific apps
"applications.sweet_tenant",
)
INSTALLED_APPS = SHARED_APPS + [app for app in TENANT_APPS if app not in SHARED_APPS]
Поведение
Общие схемы являются общими для всех арендаторов. Любой арендатор может видеть любые данные из публичной схемы, если вы не фильтруете их. Это нормальное поведение
Арендаторы (клиенты) создаются в публичной схеме.
НЕДОСТАТКИ
Я не хочу, чтобы эти данные (арендаторов) мог видеть любой арендатор, потому что они будут содержать частные данные клиентов. Каждый арендатор должен видеть только свои данные, и только владелец SaaS может видеть все данные (суперпользователь в публичной схеме).
ПРОБЛЕМА
Я добавил этот код (см. код ниже) в файл admin.py для фильтрации данных арендатора. Это работает нормально. Но проблема в том, что я не смог определить, когда это не арендатор, а суперпользователь публичной схемы. Или есть лучший способ добиться этого?
from django.contrib import admin
from django_tenants.admin import TenantAdminMixin
from django.db import connection
from .models import Client
class ClientAdmin(TenantAdminMixin, admin.ModelAdmin):
list_display = (
"name",
"schema_name",
"created_on",
)
def get_readonly_fields(self, request, obj=None):
if obj: # editing an existing object
return self.readonly_fields + ('schema_name', 'created_on')
return self.readonly_fields
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(name=connection.tenant)
admin.site.register(Client, ClientAdmin)