feat: add authentication and RBAC

- packages/database: schema Prisma (users/sessions/roles/permissions/
  user_roles/role_permissions/audit_logs/password_reset_tokens), migration
  inicial e seed (permissoes+perfis+bootstrap super_admin com senha
  aleatoria em FIRST_LOGIN.txt). Decisao de ORM (Prisma) documentada em
  docs/ARCHITECTURE.md
- packages/shared: catalogo de permissoes (fonte unica usada por seed e API)
- apps/api: NestJS 11 + Fastify
  - autenticacao: Argon2id, access JWT + refresh token opaco com rotacao,
    cookies HttpOnly/SameSite=Lax, change/forgot/reset password
  - rate limiting progressivo de login via Redis (bloqueio crescente por IP)
  - RBAC reforcado no backend (PermissionsGuard), protecao contra
    auto-elevacao de privilegio
  - auditoria (audit_logs) nas acoes sensiveis, com redacao de segredos
  - health checks reais (postgres+redis), swagger desabilitavel, logs
    estruturados JSON com request_id de correlacao, filtro global de
    excecoes sem vazar erro cru
- infrastructure/docker/api.Dockerfile: build multi-stage do monorepo pnpm
- docker-compose.yml: servico api na rede interna, sem porta publicada

Testado via containers reais: login, /me, refresh, change-password,
rate limit (7 tentativas -> 429), RBAC (nega/permite), bloqueio de
auto-elevacao (403), audit log populado, health checks, lint e testes
unitarios passando.
This commit is contained in:
2026-08-27 12:23:02 -03:00
parent eee6d7aece
commit a2898fa566
69 changed files with 10161 additions and 7 deletions

40
TODO.md
View File

@@ -57,13 +57,39 @@ mestre original (`agente.md`, seções 90-93).
ODBC — decisão adequada, não precisa dos módulos pgsql nativos.
## Fase 3 — Backend base
- [ ] apps/api (NestJS + Fastify) bootstrap
- [ ] Autenticação (Argon2id, access+refresh, cookies HttpOnly)
- [ ] Rate limiting (login e endpoints sensíveis)
- [ ] RBAC (users/roles/permissions/user_roles/role_permissions) + tela de perfis
- [ ] Auditoria (audit_logs) + interceptor genérico
- [ ] Health checks /api/health(/live|/ready)
- [ ] Swagger/OpenAPI (desabilitável em produção)
- [x] apps/api (NestJS 11 + Fastify) bootstrap — containerizado, healthy
- [x] packages/database (Prisma) + packages/shared (catálogo de permissões)
— decisão de ORM documentada em docs/ARCHITECTURE.md 3.6.1
- [x] Migration inicial aplicada (users/sessions/roles/permissions/
user_roles/role_permissions/audit_logs/password_reset_tokens)
- [x] Seed (40 permissões, 4 perfis, bootstrap super_admin com senha
aleatória em FIRST_LOGIN.txt chmod 600) — testado
- [x] Autenticação (Argon2id, access JWT + refresh opaco com rotação,
cookies HttpOnly/SameSite=Lax, refresh_token restrito a /api/auth) —
testado: login, /me, refresh, change-password, revogação de sessão
- [x] Rate limiting de login progressivo via Redis (5/60s, bloqueio
1min→2min→4min...até 1h por IP) — testado com 7 tentativas seguidas
- [x] RBAC completo (users/roles/permissions/user_roles/role_permissions)
reforçado no backend via PermissionsGuard — testado (nega sem
permissão, permite com todas as permissões) + unit tests
- [x] Proteção contra auto-elevação de privilégio (usuário não altera os
próprios roleIds) — testado, HTTP 403
- [x] Auditoria (audit_logs) chamada explicitamente em cada ação sensível
(login/login_failed/logout/password_changed/user_created/
user_updated/role_*) com redação de campos sensíveis — testado via
GET /api/audit (roles.manage/audit.view), paginação server-side
- [x] Health checks /api/health, /api/health/live, /api/health/ready
(Postgres + Redis reais, sem dado fake) — testado
- [x] Swagger/OpenAPI em /api/docs, desabilitável via SWAGGER_ENABLED=false
— testado (200 com flag default true)
- [x] Logs estruturados JSON (nestjs-pino) com request_id de correlação e
redação de senha/tokens/cookies
- [x] Filtro global de exceções: nunca expõe erro cru, sempre requestId
- [x] Lint (eslint --fix) e testes unitários (PermissionsGuard) passando
- [ ] Recuperação de senha por e-mail: lógica completa (token com
expiração, hash, uso único), mas envio real via SMTP é um stub que
só loga — falta credencial SMTP real (.env SMTP_*), meramente
externo — trocar MailerService por nodemailer quando houver
## Fase 4 — Telefonia (camada de aplicação)
- [ ] packages/telephony: TelephonyProvider + AsteriskTelephonyProvider