Tools / RLS-Konverter

Supabase-RLS-Konverter

Wandle Supabase-Row-Level-Security in reines Postgres um – direkt im Browser. Dein SQL verlässt diese Seite nie.

Läuft vollständig in deinem Browser (WebAssembly). Das SQL, das du einfügst oder hinzufügst, wird nie hochgeladen – die Seite lädt den Konverter einmal herunter und erledigt den Rest lokal.

Ziel
Ausgabekonvention

Policies wandern auf app.*-Accessor-Funktionen über transaktionslokale Einstellungen. Die Datenbank weiß nichts mehr von JWTs.

Rollenmodell

Auf CapyDB verbindet sich deine App als Eigentümer ihrer Tabellen, daher wird Row-Level-Security per FORCE erzwungen. Getrennte Rollen brauchen CREATE ROLE, und das hat eine CapyDB-Datenbankrolle nicht.

Typ der Benutzer-ID

Nimm text, wenn deine Benutzer-IDs keine UUIDs sind, etwa die user_...-IDs von Clerk.

01

Was konvertiert wird

Supabase-RLS ist normales CREATE POLICY plus ein Kontext, den nur Supabase liefert: auth.uid() und auth.jwt(), die Rollen anon, authenticated und service_role und ein JWT in jeder Anfrage. Diese Kontextschicht, nicht die Policies, hält ein Projekt bei Supabase fest.

Der Konverter verlegt die ganze Schicht, sodass deine Policies auf reinem Postgres laufen und weiter dieselbe Autorisierung leisten.

  • -auth.uid(), auth.jwt(), auth.role() und auth.email() werden zu Accessor-Funktionen über transaktionslokale Einstellungen; jeder JWT-Claim bekommt eine eigene Einstellung.
  • -TO anon und TO authenticated werden zu Prädikaten, service_role wird zu einem Service-Pfad, der auch restriktive Policies passiert.
  • -FOR-ALL-Policies werden pro Befehl aufgeteilt, Spalten-Defaults wie default auth.uid() werden umgeschrieben.
  • -Der Bericht nennt die Einstellungen, die deine Anwendung der Datenbank jetzt schuldet – deine Integrations-Checkliste.

02

Zwei Konventionen

Vanilla, der Standard, ist das übliche Setup für reines Postgres: Deine App prüft den Aufrufer und setzt pro Transaktion typisierte Fakten (app.user_id, app.org_id). Nichts in der Datenbank weiß von JWTs.

Supabase-kompatibel ist der direkte Umzug: ein auth.*-Shim über request.jwt.claims, sodass Policies fast wörtlich übernommen werden. Der Service-Pfad ist die Rolle in den Claims: Setze "role": "service_role" nur aus Servercode, der den Service-Key verwendet hat.

Beide laufen auf CapyDB mit dem Modell mit einer Rolle: Der Eigentümer der Zelle verbindet sich, Row-Level-Security wird per FORCE erzwungen, und es müssen keine Rollen angelegt werden.

03

Was er nicht errät

Alles, was sich nicht mechanisch übertragen lässt, wird gemeldet statt falsch übersetzt:

  • -Policies, die auf auth.users verweisen – diese Tabelle bleibt bei Supabase; übertrage zuerst die Spalten, die du brauchst.
  • -Policies auf von Supabase verwalteten Schemas wie storage und realtime.
  • -Funktionsrümpfe, die auth.* aufrufen, zusammen mit den Policies, die davon abhängen.
  • -SECURITY-DEFINER-Funktionen, die in eine Tabelle unter FORCE schreiben – sie umgehen Row-Level-Security nicht mehr –, samt Lösung. Schreibzugriffe über EXECUTE werden nicht erkannt.

04

Nichts verlässt deinen Browser

Der Konverter ist capyrls, kompiliert zu WebAssembly. Die Seite lädt ihn einmal als statische Datei; dein SQL wird aus dem Textfeld und aus den gewählten Dateien gelesen, in der Seite konvertiert und dir als Download zurückgegeben.

Kein Konto, kein Upload, kein Protokoll dessen, was du einfügst. Dieselbe Engine läuft auch im CLI, falls du ganz ohne Browser arbeiten willst.

05

Derselbe Konverter auf der Kommandozeile

capydb migrate rls führt diesen Konverter gegen dein Repository aus oder, am genauesten, gegen die laufende Supabase-Datenbank. capyrls steht unter MIT-Lizenz und funktioniert mit jedem Postgres als Ziel.

# from your repo (finds supabase/migrations) or straight from the live database
$ capydb migrate rls
$ capydb migrate rls --source-url "$SUPABASE_DIRECT_URL" --uid-type text

# standalone, MIT, any Postgres
$ go install github.com/capydatabase/capyrls/cmd/capyrls@latest
$ capyrls convert supabase/migrations