RLS is de belangrijkste knop in je Supabase-project. Dit is wat hij doet, hoe je hem goed zet en welke policies je meestal nodig hebt.
Wat row level security doet
Je Supabase-database is via een publieke sleutel rechtstreeks vanuit de browser bereikbaar. Dat is handig, maar het betekent ook dat de database zelf moet bepalen wie welke rij mag zien. Dat is row level security: per rij een regel die zegt of de huidige gebruiker erbij mag.
Staat RLS uit, dan is er geen rem: iedereen met je publieke sleutel leest de hele tabel. Die sleutel staat gewoon in je frontendcode en is dus voor iedereen zichtbaar.
RLS aan zonder policy betekent: dicht
Zodra je RLS aanzet, blokkeert de database alles wat geen policy toestaat — ook je eigen app. Dat is verwarrend: je app lijkt stuk, terwijl de beveiliging juist werkt. De oplossing is niet RLS uitzetten, maar de juiste policies toevoegen.
De policies die je meestal nodig hebt
Voor een tabel met gegevens van gebruikers zelf komt het meestal neer op vier regels: lezen, toevoegen, bijwerken en verwijderen, allemaal gekoppeld aan de ingelogde gebruiker via auth.uid().
- Lezen: alleen rijen waarvan user_id gelijk is aan auth.uid()
- Toevoegen: alleen als de nieuwe rij user_id = auth.uid() heeft
- Bijwerken en verwijderen: dezelfde voorwaarde als lezen
- Publieke tabellen (zoals een blogindex): alleen lezen voor iedereen, schrijven nooit
De valkuilen
- Een policy met 'using (true)' — dat is geen beveiliging, dat is een open deur.
- Rollen zoals 'admin' in de profieltabel die de gebruiker zelf mag bijwerken; dan zet iemand zichzelf op admin.
- De service role key in de frontend; die negeert alle policies.
- Rechten vergeten: een nieuwe tabel heeft niet automatisch toegang via de API, ook met correcte policies niet.
Hoe je het controleert
Loop elke tabel langs: staat RLS aan, en is er per actie een policy die aan de ingelogde gebruiker gekoppeld is? Test daarna met een tweede testaccount of je echt geen gegevens van de eerste gebruiker ziet. Dat is de enige test die telt.
Gebruik daarnaast de Supabase security checklist om de overige instellingen na te lopen.
Veelgestelde vragen
Kan ik RLS tijdelijk uitzetten tijdens het bouwen?
Het kan, maar het is riskant: dit is precies wat mensen vergeten terug te zetten. Werk liever meteen met policies en een testaccount.
Is de anon key een geheim?
Nee, die hoort publiek te zijn. Hij is alleen veilig als je RLS en policies op orde zijn.
Moet ik voor elke tabel policies schrijven?
Voor elke tabel die via de API bereikbaar is, ja. Tabellen die alleen server-side worden gebruikt kun je volledig dichtzetten.