Appearance
Supabase wijziging
Klaar. Staan in Repo-root SUPABASE_GRANTS_PLAN.md Drie wijzigingen:
.context/plans/supabase-grants.md— portable kopie van het plan, reist mee met de repo.supabase/migrations/TEMPLATE.sql.example— sjabloon met de juiste volgorde (create → grants → RLS → policies) en commentaar dat uitlegt waarom.CLAUDE.md— nieuwe sectie## Supabase migratieszodat toekomstige AI-sessies de conventie automatisch oppikken.
Geen functionele code-wijzigingen, dus niets te testen. Op een andere computer pak je dit op door dezelfde branch te checken en zo nodig naar .context/plans/supabase-grants.md te verwijzen.
Claude.md:
Supabase migraties
Vanaf 30 oktober 2026 verleent Supabase geen impliciete grants meer op nieuwe tabellen in het public schema. Voor elke nieuwe tabel in supabase/migrations/ moet de migratie de volgorde create table → grants → enable RLS → policies volgen. Zonder expliciete grant-statements is de tabel onbereikbaar via de Data API (supabase-js .from(...)).
Zie supabase/migrations/TEMPLATE.sql.example voor het sjabloon. Bestaande tabellen behouden hun impliciete grants en hoeven niet retro-actief te worden bijgewerkt.
sql
-- Template voor nieuwe tabellen in het public schema.
--
-- Volgorde: create table -> grants -> RLS enable -> policies.
--
-- Waarom de grants? Vanaf 30 okt 2026 verleent Supabase geen impliciete grants
-- meer op nieuwe tabellen in het public schema. Zonder de grant-statements
-- hieronder is de tabel niet bereikbaar via de Data API (supabase-js
-- .from(...) / REST / GraphQL) en krijg je PostgREST error 42501
-- "permission denied for table ...".
--
-- Bestaande tabellen in dit project behouden hun impliciete grants en hoeven
-- niet retro-actief te worden bijgewerkt.
--
-- Dit bestand wordt NIET door de Supabase CLI uitgevoerd (extensie .example).
-- Kopieer de inhoud naar een nieuwe migratie met de juiste timestamp-naam.
-- 1. Tabel aanmaken
create table if not exists public.<naam> (
id uuid primary key default gen_random_uuid(),
-- ... eigen kolommen
created_at timestamptz not null default now()
);
-- 2. Grants (kies de subset die past bij de rol)
grant select on public.<naam> to anon;
grant select, insert, update, delete on public.<naam> to authenticated;
grant select, insert, update, delete on public.<naam> to service_role;
-- Als de tabel een sequence gebruikt (bv. bigserial id):
-- grant usage, select on sequence public.<naam>_id_seq to anon, authenticated, service_role;
-- 3. Row Level Security aanzetten
alter table public.<naam> enable row level security;
-- 4. Policies (pas aan op de use case)
create policy "<naam>_select_own"
on public.<naam>
for select
to authenticated
using (auth.uid() = user_id);Plan: Supabase Data API grants — convention + future-proofing
Context
Op 28 april 2026 heeft Supabase aangekondigd dat het impliciete GRANT-gedrag op het public schema verdwijnt. Voor dit project (Next.js + @supabase/supabase-js, ~12 tabellen in public) gelden de volgende feiten:
- Het is een bestaand project → de wijziging treedt pas op 30 oktober 2026 in werking.
- Bestaande tabellen behouden hun grants (de impliciete defaults blijven kleven). De huidige app blijft draaien.
- Auth en Storage (users registreren, foto-uploads) zijn niet geraakt.
- Echte risico: nieuwe tabellen die ná 30 okt 2026 in
publicworden aangemaakt zonder explicieteGRANT-statements zijn onbereikbaar via de Data API (supabase-js.from(...)calls falen met PostgREST42501). - Geen enkele van de huidige 11 migraties in
supabase/migrations/bevatGRANT-statements — er wordt alleen op RLS geleund.
Doel: een lichte, niet-disruptieve voorbereiding zodat toekomstige migraties automatisch goed gaan en het project niet op 30 oktober 2026 met verrassingen wakker wordt.
Aanpak
Twee deliverables, beide klein:
1. Conventie vastleggen in een migratie-template
Nieuw bestand: supabase/migrations/TEMPLATE.sql.example
Een commentaar-richtsnoer + grant-snippet die je copy-paste't bij elke nieuwe tabel. Voorbeeld inhoud:
sql
-- Template voor nieuwe tabellen in het public schema.
-- Volgorde: create table → grants → RLS enable → policies.
-- Reden: vanaf 30 okt 2026 verleent Supabase geen impliciete grants meer op
-- nieuwe public-tabellen. Zonder de grant hieronder is de tabel niet
-- bereikbaar via de Data API (supabase-js .from(...)).
create table if not exists public.<naam> (
id uuid primary key default gen_random_uuid(),
-- ...
created_at timestamptz not null default now()
);
grant select on public.<naam> to anon;
grant select, insert, update, delete on public.<naam> to authenticated;
grant select, insert, update, delete on public.<naam> to service_role;
alter table public.<naam> enable row level security;
-- create policy ...2. Documentatie-update in CLAUDE.md
Eén korte sectie toevoegen aan CLAUDE.md onder een nieuwe ## Supabase migraties-kop, met de drie-stappen-regel (create → grant → enable RLS → policies) en een verwijzing naar het template. Daarmee pikt elke toekomstige AI-sessie het automatisch op.
Niet doen (bewuste keuzes)
- Geen defensieve "grant alle bestaande tabellen"-migratie schrijven. Bestaande tabellen houden hun grants tot we ze actief revoken. Een extra migratie zou alleen ruis zijn.
- Niet de opt-in
revoke default privileges-statements draaien. Dat zou ons vrijwillig vóór 30 okt 2026 op het nieuwe regime zetten, met risico op verrassingen zonder voordeel. - Geen
GRANT USAGE ON SCHEMA public-statements toevoegen. Die staan al van de Supabase-default en worden niet door deze wijziging geraakt.
Te wijzigen / aan te maken bestanden
- Nieuw:
supabase/migrations/TEMPLATE.sql.example(alleen voor ontwikkelaars/agents; niet uitgevoerd door Supabase CLI omdat de extensie.exampleis) - Aanpassen:
CLAUDE.md— sectie## Supabase migratiestoevoegen - Nieuw (eerste stap bij uitvoering): dit plan kopiëren naar
.context/plans/supabase-grants.mdzodat het portable is en met de repo meereist
Verificatie
- Visuele review van het template en de CLAUDE.md-sectie.
- Optioneel: maak in een lokale Supabase dev-omgeving een testtabel volgens het template aan, draai de
revoke default privileges-blok uit de Supabase changelog, en bevestig datsupabase.from("test").select()werkt (= grants werken correct). - Geen tests of CI nodig — dit is een documentatie/template-wijziging zonder functionele code-impact.
Niet in scope (toekomstig werk, indien gewenst)
- Audit van tabellen die buiten migraties zijn ontstaan (
cars,profiles,favorites,posts) en het naar migraties brengen daarvan. Niet urgent voor deze breaking change, want hun grants blijven intact. - Een
pre-commitcheck / lint die ontbrekende grants in nieuwe migraties signaleert.