54 lines
2.7 KiB
SQL
54 lines
2.7 KiB
SQL
-- Migration manual: roles de aplicação usadas pela Etapa 2 (Autenticação/RLS).
|
|
--
|
|
-- Por que duas roles novas em vez de reaproveitar a role do DATABASE_URL
|
|
-- (`seconectai`, dono das tabelas): a role criada pelo `POSTGRES_USER` do
|
|
-- docker-compose é a role bootstrap do initdb, portanto é SUPERUSER — e
|
|
-- superusers do Postgres **sempre** ignoram Row Level Security, mesmo com
|
|
-- `ENABLE ROW LEVEL SECURITY`/`FORCE ROW LEVEL SECURITY` nas tabelas. Se a
|
|
-- aplicação continuasse consultando o banco com essa role em runtime, o
|
|
-- isolamento por tenant seria só decorativo. Por isso:
|
|
--
|
|
-- * `app_master` — LOGIN + BYPASSRLS, mas SEM ser superuser. Usada via
|
|
-- `DATABASE_URL_MASTER` pelo painel master (enxerga todos os tenants),
|
|
-- como pedido no prompt da etapa.
|
|
-- * `app_tenant` — LOGIN comum, SEM BYPASSRLS e SEM ser superuser. Usada
|
|
-- via `DATABASE_URL_TENANT` para toda query autenticada como
|
|
-- tenant_user, dentro da transação que executa
|
|
-- `SET LOCAL app.current_tenant_id`; é essa role que faz as policies de
|
|
-- RLS (`prisma/migrations/20260812161100_rls_views_constraints`) valerem
|
|
-- de fato. (Desvio registrado em Etapas/09-controle-de-progresso.md: o
|
|
-- prompt original só citava `DATABASE_URL_MASTER`.)
|
|
--
|
|
-- `DATABASE_URL` (role `seconectai`) continua sendo usada só para
|
|
-- migrations e para o `PrismaService` "admin" (health check, bootstrap de
|
|
-- login antes de existir um tenant_id de sessão — ver AuthService).
|
|
--
|
|
-- As senhas abaixo são placeholders de desenvolvimento, no mesmo espírito
|
|
-- de `POSTGRES_PASSWORD`/`JWT_SECRET` em `.env.example`: troque-as em
|
|
-- produção com `ALTER ROLE ... WITH PASSWORD '...'` e atualize
|
|
-- `DATABASE_URL_MASTER`/`DATABASE_URL_TENANT` de acordo.
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_master') THEN
|
|
CREATE ROLE app_master WITH LOGIN PASSWORD 'app_master_changeme' NOSUPERUSER BYPASSRLS;
|
|
END IF;
|
|
|
|
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_tenant') THEN
|
|
CREATE ROLE app_tenant WITH LOGIN PASSWORD 'app_tenant_changeme' NOSUPERUSER NOBYPASSRLS;
|
|
END IF;
|
|
END
|
|
$$;
|
|
|
|
GRANT USAGE ON SCHEMA public TO app_master, app_tenant;
|
|
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_master, app_tenant;
|
|
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_master, app_tenant;
|
|
|
|
-- Cobre tabelas/sequences criadas por migrations futuras (etapas 3+),
|
|
-- desde que aplicadas com a mesma role que rodou esta migration.
|
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_master, app_tenant;
|
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
GRANT USAGE, SELECT ON SEQUENCES TO app_master, app_tenant;
|