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:
40
TODO.md
40
TODO.md
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user