Pular para o conteúdo principal

Page Mapping

O que é Page Mapping?​

O Page Mapping é o mecanismo central de controle de permissões baseado em URLs da Plataforma Betha. Ele define quais recursos (endpoints/páginas) do seu sistema requerem quais permissões.

Por que configurar?​

Quando você integra seu sistema com a Plataforma Betha, o Gerenciador de Acessos precisa saber:

  1. Quais permissões existem no seu sistema
  2. Quais URLs cada permissão protege
  3. Quais operações (criar, editar, excluir) estão disponíveis
  4. Como organizar as permissões no menu de gestão

Sem o Page Mapping configurado, os administradores não conseguirão gerenciar as permissões dos usuários do seu sistema.

Estrutura JSON​

O Page Mapping é um array JSON com a seguinte estrutura:

[
{
"contexts": [
"database",
"entity"
],
"constraints": [
{
"id": "CadastroPessoasPage",
"description": "Cadastro de Pessoas",
"resources": [
{
"accessControll": null,
"urlPattern": "/api/pessoas",
"methods": ["GET"]
},
{
"accessControll": "create",
"urlPattern": "/api/pessoas",
"methods": ["POST"]
},
{
"accessControll": "edit",
"urlPattern": "/api/pessoas/.*",
"methods": ["PUT"]
},
{
"accessControll": "delete",
"urlPattern": "/api/pessoas/.*",
"methods": ["DELETE"]
}
],
"accessControll": [
{ "id": "create", "description": "Criar" },
{ "id": "edit", "description": "Editar" },
{ "id": "delete", "description": "Excluir" }
]
}
],
"resources": [
{
"urlPattern": "api/public/.*",
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"]
}
],
"groups": [
{
"id": "cadastros",
"description": "Cadastros",
"constraints": ["CadastroPessoasPage"]
}
]
}
]

Campos Principais​

CampoTipoObrigatórioDescrição
contextsArraySimDimensões do contexto (database, entity, subcontextos)
constraintsArraySimLista de permissões do sistema
resourcesArrayNãoURLs públicas (sem necessidade de permissão)
groupsArrayNãoAgrupamento lógico para organização no UI

Detalhamento dos Campos​

contexts​

Define quais dimensões compõem o contexto do seu sistema:

// Sistema padrão (database + entity)
"contexts": ["database", "entity"]

// Sistema com subcontexto customizado
"contexts": ["database", "subcontexto", "entity"]
info

Cada sistema pode definir seus próprios subcontextos conforme necessidade. O nome do subcontexto é customizável e deve ser definido de acordo com a arquitetura da aplicação.

constraints​

Array de permissões do sistema. Cada constraint define:

  • id: identificador único (use nomes descritivos como CadastroPessoasPage)
  • description: texto que aparece no UI de gestão
  • resources: URLs protegidas por esta permissão
  • accessControll: operações disponíveis

resources (nível raiz)​

URLs que são públicas e não requerem permissão específica. Use para:

  • Endpoints de health check
  • APIs públicas
  • Recursos estáticos
"resources": [
{
"urlPattern": "api/public/.*",
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"]
},
{
"urlPattern": "api/health/.*",
"methods": ["GET"]
}
]

groups​

Organiza as constraints em categorias para facilitar a visualização no UI:

"groups": [
{
"id": "cadastros",
"description": "Cadastros",
"constraints": ["CadastroPessoasPage", "CadastroEmpresasPage"]
},
{
"id": "relatorios",
"description": "Relatórios",
"constraints": ["RelatorioVendasPage"]
}
]

Exemplo Completo: Sistema de RH​

[
{
"contexts": ["database", "entity"],
"constraints": [
{
"id": "FuncionariosPage",
"description": "Cadastro de Funcionários",
"resources": [
{
"accessControll": null,
"urlPattern": "/rh/api/funcionarios",
"methods": ["GET"]
},
{
"accessControll": null,
"urlPattern": "/rh/api/funcionarios/.*",
"methods": ["GET"]
},
{
"accessControll": "create",
"urlPattern": "/rh/api/funcionarios",
"methods": ["POST"]
},
{
"accessControll": "edit",
"urlPattern": "/rh/api/funcionarios/.*",
"methods": ["PUT"]
},
{
"accessControll": "delete",
"urlPattern": "/rh/api/funcionarios/.*",
"methods": ["DELETE"]
}
],
"accessControll": [
{ "id": "create", "description": "Criar" },
{ "id": "edit", "description": "Editar" },
{ "id": "delete", "description": "Excluir" }
]
},
{
"id": "FolhaPagamentoPage",
"description": "Folha de Pagamento",
"resources": [
{
"accessControll": null,
"urlPattern": "/rh/api/folha/.*",
"methods": ["GET"]
},
{
"accessControll": "processar",
"urlPattern": "/rh/api/folha/calcular",
"methods": ["POST"]
}
],
"accessControll": [
{ "id": "processar", "description": "Processar folha" }
]
}
],
"resources": [
{
"urlPattern": "rh/api/public/.*",
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"]
}
],
"groups": [
{
"id": "cadastros",
"description": "Cadastros",
"constraints": ["FuncionariosPage"]
},
{
"id": "processamento",
"description": "Processamento",
"constraints": ["FolhaPagamentoPage"]
}
]
}
]

Exemplo: Ações Específicas​

Você pode criar accessControll personalizados para ações específicas do seu sistema:

{
"id": "IntegracoesContabeisPage",
"description": "Integrações Contábeis",
"resources": [
{
"accessControll": null,
"urlPattern": "/api/integracoes/.*",
"methods": ["GET"]
},
{
"accessControll": "contabilizar",
"urlPattern": "/api/integracoes/contabilizar/.*",
"methods": ["POST"]
},
{
"accessControll": "contabilizar",
"urlPattern": "/api/integracoes/reenviar/.*",
"methods": ["POST"]
}
],
"accessControll": [
{ "id": "contabilizar", "description": "Contabilizar" }
]
}
NOTA

O mesmo accessControll pode ser usado para proteger múltiplas URLs relacionadas, como no exemplo acima onde contabilizar protege tanto /contabilizar/.* quanto /reenviar/.*.

Boas Práticas​

IDs de Constraints​

  • Use nomes descritivos: CadastroPessoasPage em vez de cp1
  • Mantenha um padrão: {Funcionalidade}Page ou {Funcionalidade}PageMapping
IMPORTANTE!

Nunca altere IDs de constraints em produção sem um plano de migração. Alterações de ID não afetam permissões já configuradas - os usuários continuarão vinculados ao ID antigo.

AccessControll​

  • Seja consistente: use os mesmos IDs em todo o sistema
  • Padronize nomenclatura: create, edit, delete ou criar, editar, excluir
  • Documente bem: descrições claras facilitam a configuração pelo administrador

Grupos​

  • Organize logicamente por módulo ou área funcional
  • Use nomes claros que facilitem a navegação
  • Revise periodicamente conforme o sistema evolui