Usuários e RBAC
Papéis Disponíveis
O SystemClinic implementa controle de acesso baseado em papéis (RBAC) com seis níveis de permissão:
| Papel | Código | Descrição |
|---|---|---|
| Super Admin | SUPER_ADMIN | Acesso cross-tenant para equipe da plataforma |
| Dono | OWNER | Acesso total ao tenant |
| Administrador | ADMIN | Acesso operacional completo |
| Recepcionista | RECEPTIONIST | Agenda, pacientes e financeiro básico |
| Profissional | PROFESSIONAL | Própria agenda e prontuários |
| Visualizador | VIEWER | Apenas leitura (relatórios e dashboards) |
Hierarquia de Acesso
SUPER_ADMIN (nível 6 — plataforma)
└── OWNER (nível 5 — organização)
└── ADMIN (nível 4)
├── RECEPTIONIST (nível 3)
├── PROFESSIONAL (nível 2)
└── VIEWER (nível 1)Matriz Completa de Permissões
Módulo de Agendamentos
| Ação | OWNER | ADMIN | RECEPTIONIST | PROFESSIONAL | VIEWER |
|---|---|---|---|---|---|
| Ver todos os agendamentos | ✅ | ✅ | ✅ | ❌ | ✅ |
| Ver próprios agendamentos | ✅ | ✅ | ✅ | ✅ | ✅ |
| Criar agendamento | ✅ | ✅ | ✅ | ❌ | ❌ |
| Editar agendamento | ✅ | ✅ | ✅ | ❌ | ❌ |
| Cancelar agendamento | ✅ | ✅ | ✅ | Próprios | ❌ |
| Finalizar atendimento | ✅ | ✅ | ❌ | Próprios | ❌ |
| Configurar disponibilidade | ✅ | ✅ | ❌ | Própria | ❌ |
Módulo de Pacientes
| Ação | OWNER | ADMIN | RECEPTIONIST | PROFESSIONAL | VIEWER |
|---|---|---|---|---|---|
| Listar pacientes | ✅ | ✅ | ✅ | ✅ | ✅ |
| Criar paciente | ✅ | ✅ | ✅ | ❌ | ❌ |
| Editar dados do paciente | ✅ | ✅ | ✅ | ❌ | ❌ |
| Inativar paciente | ✅ | ✅ | ❌ | ❌ | ❌ |
| Mesclar pacientes | ✅ | ✅ | ❌ | ❌ | ❌ |
| Exportar dados LGPD | ✅ | ✅ | ❌ | ❌ | ❌ |
Módulo de Prontuário
| Ação | OWNER | ADMIN | RECEPTIONIST | PROFESSIONAL | VIEWER |
|---|---|---|---|---|---|
| Ver prontuário (todos) | ✅ | ✅ | ❌ | ❌ | ❌ |
| Ver prontuário (próprios) | — | — | — | ✅ | ❌ |
| Criar registro | ❌ | ❌ | ❌ | ✅ | ❌ |
| Assinar registro | ❌ | ❌ | ❌ | ✅ | ❌ |
| Fazer upload de arquivo | ❌ | ❌ | ❌ | ✅ | ❌ |
Módulo Financeiro
| Ação | OWNER | ADMIN | RECEPTIONIST | PROFESSIONAL | VIEWER |
|---|---|---|---|---|---|
| Ver faturas | ✅ | ✅ | ✅ | ❌ | ✅ |
| Criar fatura | ✅ | ✅ | ✅ | ❌ | ❌ |
| Registrar pagamento | ✅ | ✅ | ✅ | ❌ | ❌ |
| Aplicar desconto | ✅ (sem limite) | ✅ (sem limite) | ✅ (até limite%) | ❌ | ❌ |
| Emitir NFS-e | ✅ | ✅ | ❌ | ❌ | ❌ |
| Ver relatórios financeiros | ✅ | ✅ | ❌ | ❌ | ✅ |
Módulo de Relatórios
| Ação | OWNER | ADMIN | RECEPTIONIST | PROFESSIONAL | VIEWER |
|---|---|---|---|---|---|
| Dashboard operacional | ✅ | ✅ | ✅ | Próprios | ✅ |
| Relatório financeiro | ✅ | ✅ | ❌ | ❌ | ✅ |
| Relatório de agendamentos | ✅ | ✅ | ✅ | Próprios | ✅ |
| Exportar relatório | ✅ | ✅ | Parcial | ❌ | ✅ |
Módulo de Administração
| Ação | OWNER | ADMIN | RECEPTIONIST | PROFESSIONAL | VIEWER |
|---|---|---|---|---|---|
| Gerenciar usuários | ✅ | ✅ | ❌ | ❌ | ❌ |
| Convidar usuário | ✅ | ✅ | ❌ | ❌ | ❌ |
| Alterar papel de usuário | ✅ | ✅ | ❌ | ❌ | ❌ |
| Inativar usuário | ✅ | ✅ | ❌ | ❌ | ❌ |
| Configurações da clínica | ✅ | ✅ | ❌ | ❌ | ❌ |
| Configurar integrações | ✅ | ❌ | ❌ | ❌ | ❌ |
| Ver audit log | ✅ | ✅ | ❌ | ❌ | ❌ |
| Gerenciar plano | ✅ | ❌ | ❌ | ❌ | ❌ |
Escopos de Unidade
Além do papel, usuários podem ter acesso restrito a unidades específicas via unit_ids[]:
- Um profissional vinculado à Unidade A não vê a agenda da Unidade B
- Um administrador pode ter acesso cross-unidade explicitamente
- O Owner tem acesso a todas as unidades por padrão
Convidar Usuário
- Acesse Usuários → Convidar Usuário
- Informe:
- E-mail do novo usuário
- Papel (role)
- Unidades de acesso
- O usuário recebe um e-mail com link de convite (válido por 48 horas)
- Ao clicar no link, o usuário define sua senha e acessa o sistema
Alterar Papel de Usuário
Quando um Admin altera o papel de um usuário:
- O novo papel é salvo no banco
- Todos os refresh tokens do usuário são revogados imediatamente
- Na próxima requisição, o usuário recebe
401e é redirecionado para login - Ao fazer login novamente, o JWT reflete o novo papel
Isso garante que mudanças de permissão tenham efeito imediato, sem esperar a expiração do token.
Inativar Usuário
Usuários inativos:
- Não conseguem fazer login (401 retornado pela API)
- Têm todos os refresh tokens revogados
- Aparecem apenas com filtro "inativos" na listagem
A inativação não exclui o usuário do banco — todas as ações históricas no audit log são preservadas.
Endpoints da API
| Método | Endpoint | Papel mínimo |
|---|---|---|
GET | /users | Admin |
GET | /users/:id | Admin |
POST | /users/invite | Admin |
PUT | /users/:id | Admin |
DELETE | /users/:id (inativação) | Admin |
Implementação Técnica
O RBAC é implementado em duas camadas:
Camada 1 — Policy-based no .NET:
csharp
[Authorize(Policy = "RequireAdminOrAbove")]
[HttpGet("reports/cashflow")]
public async Task<IActionResult> GetCashflow() { ... }Camada 2 — RbacService no Angular:
typescript
// Verificação no componente
if (this.rbac.isAtLeast('ADMIN')) {
// exibir botão de relatório financeiro
}
// Guard de rota
canActivate: [() => inject(RbacService).hasRole('OWNER')]Acesso
- URL:
/app/users - Guard: Requer autenticação + papel Admin ou superior