-- ===================================================================== -- TeeCup — dedikert applikasjonsrolle + grants (migrasjon 002) -- ===================================================================== -- Kjøres av en admin/superbruker (f.eks. teeoff_admin). -- -- HVORFOR: RLS beskytter IKKE mot en superbruker. Postgres lar superuser og -- roller med BYPASSRLS hoppe fullstendig over alle policyer. Runtime-appen MÅ -- derfor koble til med en rolle som verken er superuser eller har BYPASSRLS. -- Denne rollen eier heller ikke tabellene (tabellene har dessuten FORCE RLS), -- så den er alltid underlagt policyene. -- -- Passord: sett det utenfra, ikke i denne fila. Kjør f.eks.: -- psql -d teecup_db -v teecup_app_password="$(cat /path/to/secret)" \ -- -f 002_roles_and_grants.sql -- (Aldri sjekk inn et ekte passord i git.) -- ===================================================================== \set ON_ERROR_STOP on -- --- Rolle (cluster-nivå: opprett bare hvis den ikke finnes) ---------- -- Eksplisitt NOSUPERUSER / NOBYPASSRLS — dette er hele poenget. -- MERK: dette var opprinnelig en DO $$ ... $$-blokk med -- "PASSWORD :'teecup_app_password'" inni. psql interpolerer ikke :'var' -- inne i dollar-quoted strenger, så det feilet alltid med -- "syntax error at or near ':'". Erstattet med \if/\else slik at -- PASSWORD-linjen står som vanlig SQL utenfor $$ $$ (verifisert mot -- scratch-database, se test_isolation.sql-kjøringen). SELECT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'teecup_app') AS teecup_app_exists \gset \if :teecup_app_exists \echo 'teecup_app finnes allerede, hopper over CREATE ROLE' \else CREATE ROLE teecup_app LOGIN PASSWORD :'teecup_app_password' NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS INHERIT; \endif -- --- Grants (kjøres mens du er koblet til teecup_db) ------------------ GRANT CONNECT ON DATABASE teecup_db TO teecup_app; GRANT USAGE ON SCHEMA public TO teecup_app; -- Runtime-appen trenger vanlig DML på domenetabellene, men skal IKKE kunne -- endre skjema eller policyer (det følger av at den ikke eier tabellene og -- ikke er superuser). GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO teecup_app; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO teecup_app; -- Samme rettigheter automatisk på fremtidige tabeller/sekvenser laget av -- migrasjonseieren. ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO teecup_app; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO teecup_app; -- MERK: teecup_app får bevisst IKKE rettigheter til å endre RLS. Bootstrap av -- nye organisasjoner (INSERT i organization) skjer via en privilegert sti i -- auth-laget, ikke med runtime-rollen.