Sistema de Permissões Granular
📚 Referência completa e treinamento: este módulo tem uma lição detalhada de certificação — passo a passo de todas as telas, campos e regras.
🟠 PLANEJADO — ainda NÃO está em produção (GitLab #395). Esta página descreve um refactor planejado do controle de permissões. O modelo em produção hoje é o clássico: papel (Role) + ações fixas (VIEW/CREATE/UPDATE/DELETE) por módulo — ver Configurações → Usuários e Permissões. O conteúdo abaixo é o desenho futuro, no roadmap.
Modelo atual (produção) vs. modelo planejado
| Atual (produção) | Planejado (#395) | |
|---|---|---|
| Papéis por usuário | 1 (Role) | N (PerfilPermissao) |
| Ações | 4 fixas | 10+ configuráveis |
| Granularidade | Por módulo | Por permissão |
| Grupos | Não | GrupoPermissao |
| Customização | Hard-coded | Tela admin |
| Integração Keycloak | Não | Sim (sincroniza) |
Models previstos (8)
PerfilPermissao— perfil (ex: "Recepcionista Sênior")Permissao— permissão atômica (ex: "AGENDAMENTO")PermissaoAcao— ação dentro de uma permissão (VIEW, CREATE, ...)PermissaoAcaoPerfilPermissao— junction perfil ↔ açõesGrupoPermissao— agrupador organizacionalTipoDeAcao— enum: VIEW, CREATE, UPDATE, DELETE, EXPORT, IMPRIMIR, AUTORIZAR, CANCELAR, REATIVAR, ESTORNAR, ...ColaboradorPermissao— vínculo colaborador ↔ perfisColaboradorGrupo— vínculo colaborador ↔ grupos
Endpoints (9+ endpoints)
| Método | Endpoint | Função |
|---|---|---|
| POST | /perfil/grupo | Criar GrupoPermissao |
| GET | /perfil/grupo | Listar grupos do banco |
| GET | /perfil/grupo-keycloak | Listar grupos no Keycloak |
| GET | /perfil/permissoes | Listar todas permissões |
| GET | /perfil/colaborador/:id/permissoes | Permissões resolvidas do colaborador |
| PUT | /perfil/grupo/:id/permissoes | Editar permissões do grupo |
| PUT | /perfil/colaborador/:id/permissoes | Editar permissões do colaborador |
| GET | /perfil/perfil-permissoes | Listar PerfilPermissao |
| POST | /perfil/perfil-permissoes | Criar PerfilPermissao |
Exemplo de Hierarquia
GrupoPermissao "Equipe Recepção"
├─ PerfilPermissao "Recepcionista Júnior"
│ ├─ Permissao "AGENDAMENTO"
│ │ ├─ PermissaoAcao VIEW
│ │ ├─ PermissaoAcao CREATE
│ │ └─ PermissaoAcao UPDATE (não DELETE)
│ ├─ Permissao "PACIENTE"
│ │ ├─ PermissaoAcao VIEW
│ │ ├─ PermissaoAcao CREATE
│ │ └─ PermissaoAcao UPDATE
│ └─ Permissao "FILA_ATENDIMENTO" (VIEW)
└─ PerfilPermissao "Recepcionista Sênior"
├─ Tudo do Júnior +
├─ AGENDAMENTO.DELETE
├─ PACIENTE.DELETE
├─ AUTORIZACAO.CREATE/VIEW
└─ Permissao DISCOUNT_NIVEL_1 (até 5%)
Colaborador "Maria" → vinculada ao PerfilPermissao "Recepcionista Sênior"
→ vinculada ao Grupo "Equipe Recepção Centro"
→ vinculada ao Keycloak Group "rabi-recep" (SSO)
Como o sistema resolve permissões
- Login via Keycloak → token JWT com sub (userId)
- API valida token + carrega Colaborador
- Recupera todos os PerfilPermissao via ColaboradorPermissao
- União: SET de PermissaoAcao = SOMA de todos os perfis
- Compara com permissão exigida pela rota
- Permite ou bloqueia (HTTP 403)
- Cache de 5 min (invalida ao alterar perfil)
Migração do modelo antigo
Script one-shot migra Roles existentes:
- Role.RECEPCIONISTA → PerfilPermissao "Recepcionista (padrão)"
- Role.MEDICO → PerfilPermissao "Médico (padrão)"
- Role.ADMIN → PerfilPermissao "Administrador (padrão)"
- Role.GERENTE → PerfilPermissao "Gerente (padrão)"
Após migração, admin pode customizar perfis ou criar novos. Role antigo não é deletado (rollback possível).
Sincronização Keycloak
Sistema mantém vínculo bidirecional com grupos do Keycloak (rabi-recep, rabi-medicos, etc):
- Criação de PerfilPermissao opcionalmente cria Group no Keycloak
- Atribuição de colaborador a perfil sincroniza com grupo Keycloak
GET /perfil/grupo-keycloaklista grupos diretamente do Keycloak (fonte da verdade SSO)
Permissões especiais
Algumas permissões têm regras adicionais (configurável via ParametrosDoSistema):
- DUAL_APROVAL: requer aprovação de 2+ perfis (ex: estornos > R$ 10k)
- OVERRIDE_BLOCK: pode quebrar regra normal (ex: atender sem autorização — exige justificativa)
- DESCONTO_NIVEL_N: vinculado a ParametrosDeDesconto
Auditoria
Toda alteração em perfis/grupos/permissões registra em Actions com:
- Quem fez (userId)
- Quando
- O quê (criou/editou/excluiu perfil/permissão/vínculo)
- Antes vs Depois
Telas (Frontend)
/portal/configuracoes/colaboradores— gerenciar colaboradores (ListColaborador)/portal/configuracoes/colaboradores/criar— novo (FormColaborador)/portal/configuracoes/colaboradores/:id/editar— editar + atribuir perfis
Componentes
ListPermissoes— visão por colaboradorSelectPermissoes— checkbox treePermissionTable— matriz módulo × açãoFormUsuarioKeyCloack— sincronização Keycloak