Tilbake til bloggen
Guide9. mars 2026

Supabase: PostgreSQL, autentisering og RLS i én pakke

Supabase er det nærmeste jeg har kommet en backend jeg faktisk liker å jobbe med. Det er en open source Firebase-alternativ bygget på PostgreSQL, og det gir deg database, autentisering, lagring og real-time subscriptions i én tjeneste. For Nextbook ble det ryggraden i hele systemet — men det har også begrensninger som er verdt å forstå før du satser alt på det.

Hvorfor Supabase

Det finnes mange måter å bygge en backend på. Du kan sette opp en egen PostgreSQL-instans, skrive autentiseringslogikk fra bunnen av, konfigurere fillagring, og koble det hele sammen med et API-lag. Eller du kan bruke Supabase og få alt dette ut av boksen.

Managed PostgreSQL. Under panseret er det en vanlig Postgres-database. Du kan skrive rå SQL, bruke views, funksjoner, triggers — alt du forventer. Supabase legger til et REST API (PostgREST) og et JavaScript-klient som genererer queries basert på tabellstrukturen. Du får kraften til Postgres med bekvemmeligheten til et BaaS.

Innebygd autentisering. E-post/passord, OAuth-leverandører (Google, GitHub), magic links — alt er ferdig konfigurert. Du slipper å implementere passord-hashing, token-refresh og session management selv. For Nextbook var dette en massiv tidsbesparelse.

Row Level Security. RLS er Supabase sin killer feature. I stedet for å skrive autorisasjonslogikk i API-laget, definerer du sikkerhetspolicyer direkte på databasenivå. Uansett hvordan data aksesseres — via REST, real-time subscriptions eller direkte SQL — gjelder de samme reglene.

Slik bruker Nextbook Supabase

Nextbook er en læringsplattform der studenter logger inn, får tilgang til kurs, leverer oppgaver og følger egen fremgang. Alt dette drives av Supabase.

Autentisering. Studenter registrerer seg med e-post eller Google. Supabase håndterer hele flyten — fra registrering til session management. Vi bruker Supabase Auth Helpers for Next.js som gir oss server-side session-sjekking i middleware og klient-side hooks for brukerdata.

RLS-policyer. Hver student skal kun se sine egne leveringer og fremgangsdata. Kursinnhold er synlig for alle med aktiv tilgang. Vi definerer dette med RLS-policyer som refererer til auth.uid() — brukerens autentiserte ID.

Lagring. Kursmateriell — PDF-er, videoer, bilder — lagres i Supabase Storage med tilgangskontroll knyttet til samme RLS-system. Studenter kan kun laste ned materiell for kurs de har tilgang til.

Supabase-klient med RLS

Oppsettet for å bruke Supabase med Row Level Security i en Next.js-app:

import { createBrowserClient } from '@supabase/ssr';

export function createClient() {
  return createBrowserClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
  );
}

// RLS-policy i SQL:
// CREATE POLICY "Studenter ser kun egne leveringer"
//   ON submissions FOR SELECT
//   USING (auth.uid() = student_id);
//
// CREATE POLICY "Studenter kan levere oppgaver"
//   ON submissions FOR INSERT
//   WITH CHECK (auth.uid() = student_id);

anon-nøkkelen er trygg å eksponere til klienten fordi RLS-policyene bestemmer hva hver bruker faktisk kan se og gjøre. Selv om noen inspiserer nettverkstrafikken og finner nøkkelen, kan de kun aksessere data som policyene tillater for deres autentiserte bruker.

Autentiseringsflyt med session management

Slik håndterer Nextbook registrering og innlogging:

import { createClient } from '@/lib/supabase/client';

async function signUp(email: string, password: string) {
  const supabase = createClient();

  const { data, error } = await supabase.auth.signUp({
    email,
    password,
    options: {
      emailRedirectTo: `${window.location.origin}/auth/callback`,
    },
  });

  if (error) throw new AuthError(error.message);
  return data.user;
}

async function signIn(email: string, password: string) {
  const supabase = createClient();
  const { data, error } = await supabase.auth.signInWithPassword({ email, password });

  if (error) throw new AuthError(error.message);
  return data.session;
}

// Lytt på auth-endringer for å oppdatere UI
function useAuthListener() {
  const supabase = createClient();

  useEffect(() => {
    const { data: { subscription } } = supabase.auth.onAuthStateChange(
      (event, session) => {
        if (event === 'SIGNED_OUT') router.push('/');
        if (event === 'SIGNED_IN') router.push('/dashboard');
      },
    );
    return () => subscription.unsubscribe();
  }, []);
}

Supabase håndterer token-refresh automatisk. Når en session nærmer seg utløp, fornyer klientbiblioteket tokenet i bakgrunnen uten at brukeren merker noe. Callback-ruten (/auth/callback) håndterer verifiseringslenkene som sendes på e-post etter registrering.

Begrensninger og ting å vite

Supabase er ikke perfekt, og det er viktig å forstå ulempene.

Vendor lock-in. Selv om Supabase er open source, er det i praksis krevende å migrere bort. RLS-policyer, auth-systemet og storage-integrasjonen er tett koblet. Du kan alltid ta med deg PostgreSQL-dataene, men resten må bygges på nytt.

Edge Functions. Supabase sine Edge Functions (Deno-basert) er nyttige for webhooks og bakgrunnsoppgaver, men de har begrensninger sammenlignet med en dedikert backend. Kald-start-tider kan være merkbare, og debugging er vanskeligere enn med en lokal server.

Real-time skalering. Real-time subscriptions fungerer fint for moderat trafikk, men ved høy last kan det bli dyrt og kreve finjustering av hvilke tabeller som sender oppdateringer.

Kompleks forretningslogikk. Når forretningslogikken din vokser utover enkle CRUD-operasjoner, kan det bli vanskelig å uttrykke alt med RLS-policyer og database-funksjoner. På et tidspunkt trenger du et ordentlig API-lag — og da er spørsmålet om du bygger det med Supabase Edge Functions eller med et separat rammeverk som FastAPI.

Oppsummering

Supabase er et utmerket valg for prosjekter som trenger en komplett backend raskt — spesielt hvis du allerede kjenner PostgreSQL. For Nextbook har det vært en produktivitetsmultiplikator: vi fikk autentisering, database og lagring opp og kjøre på dager i stedet for uker. Nøkkelen er å forstå hva det er godt til, og ha en plan for når du eventuelt vokser ut av det.

#supabase#database#auth#nextbook

Nyhetsbrev

Få nye innlegg rett i innboksen.