IMPLEMENTAR SISTEMA DE SEGURANÇA NA APLICAÇÃO EXISTENTE Você deve implementar autenticação e controle de acesso na aplicação atual sem quebrar as funcionalidades existentes. A aplicação já possui: Processamento de relatórios Upload de arquivos Download de ZIP Gestão de campanhas Agora deve ser protegida. 1️⃣ IMPLEMENTAR AUTENTICAÇÃO BASEADA EM SESSÃO Usar: bcrypt para hash de senha Sessão com cookie HTTPOnly Cookie com: Secure = true (em produção) SameSite = Strict HttpOnly = true Criar middleware: requireAuth Toda rota sensível deve usar esse middleware. Rotas protegidas: Upload de relatório Download de ZIP Visualizar campanhas Reprocessar Admin 2️⃣ CRIAR MODELOS DE BANCO Tabela: users Campos: id (UUID) username (string, único) password_hash (string) role (enum: ADMIN, OPERADOR) ativo (boolean default true) failed_attempts (int default 0) lock_until (datetime nullable) criado_em (datetime) ultimo_login (datetime nullable) Tabela: services Campos: id nome descricao Tabela: user_services Campos: user_id service_id Relacionamento muitos-para-muitos. 3️⃣ IMPLEMENTAR LOGIN SEGURO Rota: POST /login Fluxo: Buscar usuário Verificar se ativo Verificar se lock_until não está no futuro Comparar senha com bcrypt Se errar: Incrementar failed_attempts Se >= 5 → definir lock_until = agora + 15 minutos Se acertar: Resetar failed_attempts Atualizar ultimo_login Criar sessão 4️⃣ IMPLEMENTAR LOGOUT Rota: POST /logout Destruir sessão. 5️⃣ CONTROLE DE ACESSO POR SERVICE_ID Criar middleware: requireServiceAccess(service_id) Regra: ADMIN acessa tudo OPERADOR só acessa services presentes na tabela user_services Aplicar este middleware em: Upload de relatório Download de ZIP Visualização de campanhas Se não autorizado: → retornar HTTP 403 6️⃣ CRIAR PAINEL ADMIN DE USUÁRIOS Rota protegida: /admin/users Apenas ADMIN pode acessar. Funcionalidades: Criar usuário Definir senha (hash com bcrypt) Definir role Selecionar services (checkbox) Ativar/desativar usuário Resetar senha 7️⃣ SEGURANÇA DE UPLOAD No upload de relatórios: Permitir apenas .csv e .txt Validar extensão Validar MIME type Limite máximo de tamanho (ex: 5MB) Armazenar fora da pasta pública 8️⃣ RATE LIMIT GLOBAL NO LOGIN Limitar tentativas por IP: 10 requisições por minuto 9️⃣ CRIAR USUÁRIO ADMIN INICIAL Se banco estiver vazio: Criar automaticamente: username: admin senha: definir via variável de ambiente role: ADMIN 🔒 IMPORTANTE Nunca armazenar senha em texto puro Nunca expor rotas sem requireAuth Nunca confiar em dados enviados pelo front Validar service_id sempre no backend 🧩 ORDEM DE IMPLEMENTAÇÃO Criar modelos Implementar login/logout Criar middleware requireAuth Criar middleware requireServiceAccess Proteger rotas existentes Criar painel admin Não alterar lógica de processamento de relatórios. Apenas adicionar camada de segurança.