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)
Вернуться на верх