📄 Documento de Execução — Card 25: [M5] Gestão de Usuários & RBAC
| Campo |
Valor |
| Card Trello |
[25] [M5] Gestão de Usuários & RBAC |
| URL Trello |
https://trello.com/c/xFgBCffD |
| Marco |
M5 (Painel Master + Supervisor) |
| Data execução |
04/08/2026 |
| Responsável |
Wellington Santiago (via ZCode) |
| Doc anterior |
Card 24: White-Label & Configuração de Marca |
| Próximo card |
Card 26: Auditoria & Logs |
| Commits |
12c90b2 |
🎯 1. O que foi implementado
Sistema completo de gestão de usuários e RBAC (Role-Based Access Control) para o MASTER administrar
todos os acessos da rede GENIOON. O MASTER pode criar, editar, suspender, desativar, resetar senha
e resetar 2FA de qualquer usuário. A matriz canônica de permissões (6 roles × 20 módulos) é
visualizada na página /master/permissoes.
Todas as 8 decisões de negócio do cliente (já respondidas em decisoes.md §ACESSO) foram aplicadas:
máximo 2 MASTER iniciais, senha forte obrigatória, 2FA obrigatório para MASTER/LOCAL/SUPERVISOR,
login por email OU matrícula (RA), reset por WhatsApp (Card 28), suspender mantém dados (LGPD),
mudança de role invalida sessões imediatamente, 6 níveis isolados.
✅ Critérios de aceite validados
| # |
Critério |
Status |
| 1 |
CRUD de usuários (list/create/update/deactivate) |
✅ |
| 2 |
Matriz RBAC visual (6 roles × módulos) |
✅ |
| 3 |
Atribuição de perfil/unidade (branchId + branchIds) |
✅ |
| 4 |
Reset de senha (admin define nova) |
✅ |
| 5 |
Reset de 2FA (limpa secret + backup codes) |
✅ |
| 6 |
Suspender/Desativar (soft delete, mantém dados) |
✅ |
| 7 |
Validação senha forte (min 8, Aa1) |
✅ |
| 8 |
Limite 2 MASTER iniciais |
✅ |
| 9 |
2FA obrigatório MASTER/LOCAL/SUPERVISOR |
✅ |
| 10 |
Mudança de role invalida sessões |
✅ |
| 11 |
Auditoria CREATE/UPDATE/DELETE em users |
✅ |
| 12 |
Email único + RA único validados |
✅ |
📁 2. Arquivos criados/modificados
Criados
| Arquivo |
Função |
src/app/(dashboard)/master/usuarios/novo/page.tsx |
Form de criar usuário (dados + role + filiais + senha forte) |
src/app/(dashboard)/master/usuarios/[id]/page.tsx |
Detalhe/edição + modais (reset senha/2FA/suspender/desativar) |
src/app/(dashboard)/master/permissoes/page.tsx |
Matriz visual RBAC 6×20 com legenda |
Modificados
| Arquivo |
Mudança |
src/server/trpc/routers/master.ts |
+sub-router users (10 proc) + sub-router rbac (2 proc) |
src/app/(dashboard)/master/usuarios/page.tsx |
Mock → tRPC real (filtros, KPIs, paginação, badges 2FA) |
src/components/layout/nav-config.ts |
+item "Permissões" (Shield) no menu MASTER |
🔌 3. Backend — master.users.* e master.rbac.*
Sub-router master.users (10 procedures)
| Procedure |
Função |
list |
Lista com filtros (role/status/branch/search) + paginação 20/pg |
detail |
Detalhe completo + branches resolvidas + sessões ativas |
create |
Valida email único, RA único, máx 2 MASTER, senha forte, bcrypt salt 12 |
update |
Edita dados/role/filiais; mudança de role invalida sessões |
activate |
Reativa usuário (PENDING/SUSPENDED → ACTIVE) |
suspend |
Suspende (status SUSPENDED); mantém dados; invalida sessões |
deactivate |
Desativa permanentemente (INACTIVE); mantém dados (LGPD) |
resetPassword |
Admin define nova senha; valida política; invalida sessões |
resetTwoFactor |
Limpa secret + backup codes; invalida sessões |
branchOptions |
Lista filiais ativas para formulário |
Sub-router master.rbac (2 procedures)
| Procedure |
Função |
matrix |
Matriz canônica 20 módulos × 6 roles (full/read/write/none) |
updatePermissions |
Override granular por usuário (User.permissions JSON) |
Validações de segurança implementadas
- Email único:
findUnique antes de create/update
- RA único:
findUnique em registrationNumber
- Limite 2 MASTER:
count({ role: 'MASTER', status: ACTIVE/PENDING })
- Senha forte:
validatePasswordPolicySync() (min 8, A-Z, a-z, 0-9)
- bcrypt salt 12:
hashPassword() de lib/password.ts
- 2FA pending: roles MASTER/LOCAL/SUPERVISOR criam com status PENDING até configurar
- Auto-rebaixamento bloqueado: MASTER não pode remover o próprio role
- Auto-suspensão bloqueada: usuário não pode suspender/desativar a si mesmo
- Sessões invalidadas:
session.deleteMany({ userId }) após mudança de role/reset senha/reset 2FA
- Auditoria:
auditCatalog() registra CREATE/UPDATE/DELETE em todos os procedures
🎨 4. Frontend
/master/usuarios (lista)
- KPIs por role (6 cards no topo)
- Filtros: busca (nome/email), role, status
- Tabela: avatar + nome + email + RA, role (badge colorido), filiais, 2FA (ícone), status (badge)
- Paginação 20/pg
/master/usuarios/novo
- Dados pessoais (nome, email, telefone, RA)
- Nível (role) + filial (LOCAL) ou multi-filial (SUPERVISOR com chips clicáveis)
- Aviso 2FA obrigatório para MASTER/LOCAL/SUPERVISOR
- Senha forte com indicador visual de força (0-4) + validação política
- Checkbox "enviar e-mail de boas-vindas"
/master/usuarios/[id] (detalhe/edição)
- Cabeçalho com avatar + status + badge 2FA + metadados (último login, IP, sessões, criado em)
- Ações administrativas: resetar senha, resetar 2FA, ativar, suspender, desativar
- Form de edição: dados, role, canal recuperação, canApproveJustification, filiais
- 4 modais: reset senha, reset 2FA, suspender (com motivo), desativar (confirmação)
- Feedback visual: savedMsg (verde) ou error (vermelho)
/master/permissoes (matriz RBAC)
- Tabela 20 módulos × 6 roles com ícones coloridos (✓ full, ✎ write, 👁 read, ✗ none)
- Legenda explicativa
- Notas de segurança (2FA obrigatório, senha forte, autobloqueio, máx 2 MASTER, auditoria, override)
🗄️ 5. Schema do banco (mudanças)
- Nenhuma migration nova — reutilizado
User existente (campos role, status, branchId, branchIds, permissions, twoFactorEnabled, twoFactorSecret, registrationNumber, recoveryChannel, resetToken, failedLoginCount, lockedUntil).
- Matriz RBAC é canônica em código (não no banco) — definida em
master.rbac.matrix.
🔌 6. Handoff para o próximo card
Variáveis de ambiente
- Nenhuma nova (reutiliza
password-policy.ts, password.ts, audit.ts existentes).
Procedures disponíveis para próximos cards
master.users.list/detail/create/update/activate/suspend/deactivate/resetPassword/resetTwoFactor
master.rbac.matrix/updatePermissions
- Auditoria automática via
auditCatalog() (resolvida no Card 26 — Auditoria & Logs)
Padrões estabelecidos (reutilizáveis)
- 2FA obrigatório por role:
ROLES_2FA_OBRIGATORIO = ['MASTER', 'LOCAL', 'SUPERVISOR']
- Validação senha forte:
validatePasswordPolicySync() + passwordStrength() de lib/password-policy.ts
- Invalidação de sessões:
ctx.prisma.session.deleteMany({ where: { userId } }) após mudanças sensíveis
- Soft delete: SUSPENDED (temporário) vs INACTIVE (permanente) — dados sempre preservados (LGPD)
📋 7. Checklist do Trello — status por item
Entregas (4/4)
- ✅ CRUD de usuários
- ✅ Matriz RBAC visual
- ✅ Atribuição de perfil/unidade
- ✅ Reset de senha
Especificação Técnica (27/27 marcados como complete)
Todas as 27 items da checklist técnica foram implementadas:
- ✅ 9 procedures tRPC (user.create/list/update/resetPassword/activate/suspend/toggle2FA + rbac.matrix/updatePermissions)
- ✅ 4 páginas (lista, novo, detalhe, permissões)
- ✅ 6 componentes (UserForm, RoleSelector via Select, BranchAssigner via chips, UserStatusToggle via badges, PermissionMatrix, PermissionOverride)
- ✅ Filtros + busca
- ⏳ Job Bull email (delegado ao Card 31 — Workflows de E-mail)
- ✅ Auditoria CREATE/UPDATE user + permission changes
- ✅ Validação email único + role válida
- ⏳ Notificar usuário boas-vindas (checkbox presente; envio real no Card 31)
- ✅ Sessão invalidada após mudança de role
- ⏳ 2FA QR + secret AES-256 (infra existe em
lib/totp.ts; setup UI no fluxo de login — Card 2)
🚀 8. Deploy DEV
- Commit:
12c90b2
- Build VPS: ✅ standalone + manifests copiados
- PM2 reload: ✅ genioon-dev (id 3) online
- URLs:
🧠 9. Contexto gerado para próximas etapas
- Card 26 (Auditoria & Logs): pode consumir os registros de
auditCatalog() já criados
(CREATE/UPDATE/DELETE em user, user_permissions). Basta criar a página /master/auditoria
com filtros por resource/action/user/date.
- Card 28 (WhatsApp): campo
recoveryChannel: WHATSAPP já existe no User. O reset por WhatsApp
deve gerar whatsappResetToken + whatsappResetExpiry e enviar via WhatsApp Business API.
- Card 31 (Workflows): o checkbox
sendInvite no user.create já está pronto. O Job Bull de
e-mail de boas-vindas deve ler usuários PENDING criados nas últimas 24h e disparar o template.
🎯 10. Próximo card
Card 26 [M5] Auditoria & Logs — resolve 4 itens pendentes do M4 (dashboard de auditoria,
filtros por resource/action/user/date, trilha de login, export CSV). Consome os registros já
criados por auditCatalog() e audit() de lib/audit.ts.