Skip to content

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 migraties zodat 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 public worden aangemaakt zonder expliciete GRANT-statements zijn onbereikbaar via de Data API (supabase-js .from(...) calls falen met PostgREST 42501).
  • Geen enkele van de huidige 11 migraties in supabase/migrations/ bevat GRANT-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 .example is)
  • Aanpassen: CLAUDE.md — sectie ## Supabase migraties toevoegen
  • Nieuw (eerste stap bij uitvoering): dit plan kopiëren naar .context/plans/supabase-grants.md zodat het portable is en met de repo meereist

Verificatie

  1. Visuele review van het template en de CLAUDE.md-sectie.
  2. 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 dat supabase.from("test").select() werkt (= grants werken correct).
  3. 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-commit check / lint die ontbrekende grants in nieuwe migraties signaleert.