Was Multi-Tenancy wirklich bedeutet

Multi-Tenancy ist nicht nur "verschiedene Nutzer". Es ist die Garantie, dass Firma A niemals Daten von Firma B sehen, bearbeiten oder löschen kann — auch nicht durch einen Bug in deinem Anwendungscode.

Das klingt selbstverständlich, aber viele SaaS-Teams implementieren Datentrennung auf Anwendungsebene: "Zeige nur Datensätze, bei denen company_id = aktuelle_firma". Das ist anfällig. Ein Logikfehler, und Kundendaten lecken.

Supabase Row Level Security löst das auf Datenbankebene. Egal was dein WeWeb-Frontend oder Xano-Backend sendet — die Datenbank erzwingt die Isolation. Das ist Multi-Tenancy, auf die man sich verlassen kann, und für deutsche B2B-Kunden mit Datenschutzbeauftragtem ist es die einzig akzeptable Implementierung.

Datenbankstruktur für Multi-Tenancy

Jede Tabelle, die tenantspezifische Daten enthält, bekommt eine workspace_id-Spalte:

ALTER TABLE projects ADD COLUMN workspace_id uuid REFERENCES workspaces(id);

Die workspaces-Tabelle enthält einen Eintrag pro Kunde. Die workspace_members-Tabelle verbindet Nutzer mit Workspaces und enthält eine Rollenspalte (owner, admin, member).

Dieses Schema gilt für jede Tabelle in deiner App: Dokumente, Kommentare, Einstellungen, Dateien — alles bekommt workspace_id. Es fühlt sich wiederholend an, ist aber nicht verhandelbar. Wenn du es bei einer Tabelle vergisst, hast du eine Datenleck-Schwachstelle.

RLS-Policies einrichten

In Supabase aktivierst du RLS für jede Tabelle und erstellst Policies:

ALTER TABLE projects ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Users can only access their workspace projects" ON projects FOR ALL USING (workspace_id = (auth.jwt() ->> 'workspace_id')::uuid);

Das ist es. Supabase überprüft automatisch diese Policy bei jeder Query. Ein Nutzer von Acme GmbH kann niemals auf Projekte von Müller Consulting zugreifen — selbst wenn er direkt die Supabase-API aufruft.

Für Insert-Policies füge eine WITH CHECK-Klausel hinzu, die sicherstellt, dass neue Datensätze immer die richtige workspace_id erhalten. Das verhindert, dass Nutzer absichtlich oder versehentlich Daten im falschen Workspace erstellen.

JWT Claims konfigurieren

Supabase muss die workspace_id des aktuellen Nutzers in seinem JWT-Token kennen. Das erreichst du mit einer benutzerdefinierten Supabase Edge Function, die nach dem Login ausgeführt wird und workspace_id dem JWT-Token hinzufügt.

In WeWeb greifst du auf diese Claims über den integrierten Auth-Plugin zu. Wenn ein Nutzer sich einloggt, enthält sein Token automatisch seine workspace_id — und Supabase RLS filtert alle Queries entsprechend.

Für Nutzer, die zu mehreren Workspaces gehören, speichere den "aktiven" Workspace in der Browser-Sitzung. Wenn ein Nutzer den Workspace wechselt, erneuere das Token mit der neuen workspace_id. WeWebs Sitzungsverwaltung macht das mit einer einzigen Aktion möglich.

Rollenbasierte Zugriffskontrolle in WeWeb

Über die Workspace-Isolation hinaus benötigst du feingranulare Rollenkontrolle. In WeWeb verwendest du bedingte Sichtbarkeit basierend auf der Nutzerrolle, die aus dem JWT-Token gelesen wird.

Für UI-Elemente: Blende Admin-Buttons aus, wenn die Rolle nicht "admin" oder "owner" ist. Für Datenbankzugriffe: Erstelle separate RLS-Policies für Lesen vs. Schreiben basierend auf der Rolle.

Ein häufiges Muster für Mittelstandskunden: "Owner" kann Nutzer einladen und abrechnen, "Admin" kann Einstellungen ändern und alle Daten sehen, "Member" kann nur eigene Daten lesen und schreiben. Dieses dreistufige Modell deckt 90 % der deutschen B2B-SaaS-Anforderungen ab.

Testen und Absichern der Isolation

Teste Multi-Tenancy mit mindestens zwei Test-Workspaces. Versuche manuell, mit einem Nutzer von Workspace A auf Daten von Workspace B zuzugreifen — direkt über die Supabase-API. Mit korrekten RLS-Policies sollte das eine leere Menge oder einen Fehler zurückgeben, niemals Daten.

Führe diesen Test durch: Erstelle Datensätze in Workspace A. Melde dich mit einem Nutzer von Workspace B an. Sende eine direkte Supabase-Abfrage ohne workspace_id Filter. Ergebnis: leere Menge. Das ist der Beweis, dass deine RLS korrekt funktioniert.

Für App Studio ist das ein Pflichtbestandteil unserer QA-Checkliste für jede SaaS, die wir bauen. Unsere <a href="/compare/weweb-vs-bubble">50+ Produktions-Apps</a> werden alle mit diesem Sicherheitsstandard geliefert.

Onboarding für neue Workspaces

Wenn ein neuer Kunde sich anmeldet, musst du automatisch: einen Workspace erstellen, den Gründer als "owner" hinzufügen, Standard-Einstellungen anlegen und die erste Stripe-Subscription verknüpfen.

In Xano erstellst du einen "Create Workspace"-Endpoint, der alle diese Schritte in einer atomaren Transaktion ausführt. WeWeb ruft diesen Endpoint nach der E-Mail-Verifikation auf.

Für deutsche B2B-Kunden füge zu diesem Onboarding-Flow hinzu: Unternehmensname und USt-ID-Eingabe (für korrekte Rechnungsstellung), Datenschutzerklärung-Zustimmung mit Zeitstempel (DSGVO-Anforderung) und ggf. die Verarbeitung eines SEPA-Lastschrift-Mandats über Stripe.