iGRPIGRP 3.0Documentation

Modelo de controlo de acesso

Entidades do Access Management, árvores de departamentos e de perfis, perfil ativo, permissões no JWT, verificação por pedido e invalidação de sessões.

Esta página explica como o Access Management organiza departamentos, perfis, utilizadores e permissões, e como isso se traduz no token que cada pedido leva.

Entidades

EntidadeTabelaPara quê
Departamentot_departmentUnidade organizacional, em árvore (parent_id)
Perfilt_roleConjunto de permissões; pertence a um departamento e pode ter um perfil pai (parent)
Utilizadort_userPessoa que entra na plataforma; tem um perfil ativo (active_role_id)
Atribuiçãot_user_role_assignmentLiga um utilizador a um perfil, com data de expiração opcional
Permissãot_permissionCapacidade nomeada (igrp.documento.ler)
Aplicaçãot_applicationAplicação registada; ligada a departamentos, perfis, recursos e menus
Recursot_resourceAgrupa permissões de uma aplicação (por exemplo, o recurso de um backend)
Entrada de menut_menu_entryItem de menu de uma aplicação, visível a perfis e departamentos
Sessãot_user_sessionSessão no servidor, identificada pelo claim sid do JWT
Departamentocodeparent_idFK paipermissõesN:MaplicaçõesN:MPerfilcodedepartmentFKparentFK paipermissõesN:MPermissãonameigrp.x.ydepartamentosN:MrecursosN:MUtilizadoractive_role_idFKstatusAtribuiçãouser_idFKrole_idFKexpires_atopcionalRecursonamepermissõesN:MSessãosidclaim do JWTuserstatusexpires_atAplicaçãocodedepartamentosN:MperfisN:MrecursosN:MEntrada de menuapplication_idFKparent_idFK paiperfisN:MdepartamentosN:M1 : NN : MN : M · permissões disponíveis no departamento1 : NN : 1perfil ativo1 : NN : MN : M1 : N
Um perfil pertence a um departamento; o utilizador recebe perfis por atribuições (com validade opcional) e escolhe um como ativo. As permissões são globais por nome e ficam disponíveis por departamento e por recurso.

Tabelas de ligação: t_role_permission (perfil ↔ permissão), t_permission_department (permissão ↔ departamento), t_department_application, t_application_role, t_application_resource, t_resource_permission e t_department_menuentry.

Departamentos

Os departamentos formam uma árvore: cada um aponta para o pai, sem limite de profundidade.

DireçãoDIRServiços AdministrativosSADMServiços TécnicosSTECArquivoARQContabilidadeCONTparent_id → departamento paisem limite de profundidade
Cada departamento aponta para o pai (parent_id), sem limite de profundidade. Uma permissão disponível num departamento pode ser dada aos perfis desse departamento e de todos os que estão abaixo dele.

O departamento não dá permissões a ninguém. Define que permissões estão disponíveis para os perfis desse departamento e dos departamentos abaixo dele.

Perfis

Cada perfil pertence a exatamente um departamento. O código do perfil é único dentro do departamento (dois departamentos podem ter um perfil tecnico). O código de um perfil filho leva o do pai como prefixo: o Técnico criado debaixo do Gestor fica gestor.tecnico.

Os perfis de um departamento também podem formar uma árvore, mas a árvore é uma regra de atribuição, não herança:

PERFIS EM SADMparent → perfil paiGestor · gestordocumento.ler · documento.criar · documento.aprovarTécnico · gestor.tecnicodocumento.ler · documento.criarEstagiário · gestor.tecnico.estagiariodocumento.ler+ igrp.relatorio.exportaro Gestor não a temrecusada ao atribuirRegra: um perfil filho só recebepermissões que o perfil pai já tem.E só as disponíveis no departamentodo perfil ou num departamento acima.
O perfil pai limita o que o filho pode receber; não há herança. O Técnico não ganha igrp.documento.aprovar por ser filho do Gestor, e o Gestor não ganha nada dos filhos.
  • Ao dar permissões a um perfil filho, só são aceites as que o perfil pai já tem.
  • E só as que estão disponíveis no departamento do perfil ou num departamento acima.
  • Nenhum perfil recebe automaticamente as permissões do pai nem dos filhos.

Permissões

As permissões são globais por nome. A convenção é igrp.{domínio}.{ação} (igrp.documento.ler), mas não é imposta: o nome aceita letras, números, ., _ e -.

Uma permissão chega a um perfil por três passos:

  1. O backend da aplicação declara-a (@IgrpPermission) e publica-a no arranque, ligada ao recurso da aplicação — ver Sincronização.
  2. Um administrador torna-a disponível num departamento.
  3. O administrador dá-a a um perfil desse departamento (ou de um departamento abaixo).

Perfil ativo e permissões efetivas

Um utilizador pode ter vários perfis, em departamentos diferentes, cada um por uma atribuição (que pode expirar). Em cada momento um é o perfil ativo.

Utilizador3 perfis atribuídosTécnico · SADM (ativo)documento.ler · documento.criarArquivista · ARQarquivo.consultarLeitor · STECrelatorio.verJWTselectedRoletecnicoorgSADMpermissionsler, criarresource_accessos 3 perfispermissionsTrocar de perfil ativo:POST /api/users/me/roles/active→ sessões revogadas → novo token
As permissões no JWT são as do perfil ativo, e só as dele — nem as dos outros perfis do utilizador, nem as do perfil pai. Os restantes perfis aparecem em resource_access.
  • O JWT leva em permissions só as permissões diretas do perfil ativo.
  • org é o código do departamento do perfil ativo.
  • resource_access lista todos os perfis ativos do utilizador.
  • Para trocar de perfil ativo: POST /api/users/me/roles/active com { roleCode, departmentCode } (o administrador usa POST /api/users/{id}/roles/active). A troca revoga as sessões do utilizador: o token seguinte já vem com as permissões do novo perfil.

Claims do JWT

{
  "sub": "f3c1…",
  "sid": "8a2d…",
  "device_id": "c41e…",
  "selectedRole": "tecnico",
  "org": "SADM",
  "permissions": ["igrp.documento.ler", "igrp.documento.criar"],
  "resource_access": {
    "minha-app": { "roles": ["tecnico", "arquivista"] }
  },
  "is_super_admin": false,
  "email": "maria.silva@exemplo.cv",
  "exp": 1793055600,
  "iss": "https://<gateway>/igrp-access-management"
}
ClaimConteúdo
sidSessão no servidor; revogá-la invalida o token no pedido seguinte
selectedRole, orgPerfil ativo e o departamento dele
permissionsPermissões diretas do perfil ativo
resource_accessPerfis do utilizador, por cliente
is_super_admintrue se alguma atribuição válida for de superadministrador
name, email, locale, …Conforme os scopes pedidos no login

Verificação em cada pedido

Na API do Access Management, cada pedido passa por duas verificações:

PedidoBearer JWTSessão ativa?sid · Redis → BDPermissão?perfil ativoEndpointsimsim401revogada ou expirada403sem permissãonãonão
Uma sessão revogada deixa de passar logo no pedido seguinte, mesmo que o JWT ainda não tenha expirado. Outros serviços podem pedir uma decisão em POST /api/authorize/check, com o resultado em cache no Redis.

Os backends dos projetos validam o JWT e decidem com @PreAuthorize sobre o permissions do token — ver o percurso em Framework › Backend › Permissões.

Invalidação

Cada alteração estrutural publica um evento. Os eventos revogam as sessões afetadas e, nalguns casos, limpam a cache de permissões no Redis:

ALTERAÇÃOEVENTOEFEITOPermissão de um perfildada ou retiradaRolePermissionChangedEventRevoga sessõesde quem tem o perfilPerfil de um utilizadoratribuído, retirado ou trocadoUserRoleChangedEventRevoga sessões do utilizadore limpa a cache de permissõesEstado do utilizadormudaUserStatusChangedEventRevoga sessões do utilizadorÂmbito do departamentomudaDepartmentScopeChangedEventRevoga sessõesde quem tem perfil no departamentoPermissãoapagadaDeletePermissionEventRevoga sessões de quem a teme limpa a cache dessa permissãoPermissão de um recursodesligadaResourcePermissionDeletedEventLimpa a cachedo recurso
Revogar uma sessão marca-a como REVOKED na base de dados e retira-a da cache de sessões no Redis: o pedido seguinte com esse sid recebe 401 e o utilizador tem de voltar a autenticar-se.

Como as permissões vão no token, uma alteração só tem efeito com um token novo. A revogação da sessão força isso: o pedido seguinte com o sid antigo recebe 401 e a aplicação volta a autenticar o utilizador.

Cenário completo

DEPARTAMENTOSPERFISTOKEN DE MARIA SILVAServiços AdministrativosSADMArquivoARQ · filho de SADMTécnico (ativo)documento.ler · documento.criarArquivistaarquivo.consultarMaria Silva2 perfis atribuídosJWTselectedRoletecnicoorgSADMpermissionsdocumento.ler, .criarresource_accesstecnico, arquivistaJWT depois da trocaselectedRolearquivistaorgARQpermissionsarquivo.consultarresource_accesstecnico, arquivistatrocar de perfil
Ter vários perfis não soma permissões: o token mostra sempre as do perfil ativo. Para usar as do outro perfil, a utilizadora troca de perfil ativo e recebe um token novo.
  1. Os Serviços Administrativos (SADM) têm o perfil Técnico, com igrp.documento.ler e igrp.documento.criar. O Arquivo (ARQ), filho de SADM, tem o perfil Arquivista, com igrp.arquivo.consultar.
  2. A Maria Silva tem os dois perfis atribuídos, com o Técnico ativo. O token dela leva as permissões do Técnico e org: SADM.
  3. Para consultar o arquivo, troca o perfil ativo para Arquivista. As sessões são revogadas e o token novo leva igrp.arquivo.consultar e org: ARQ — e já não as permissões do Técnico.

Resumo

ConceitoRegra
DepartamentoÁrvore sem limite de profundidade; define as permissões disponíveis para os seus perfis e os dos departamentos abaixo
PerfilPertence a um departamento; código único dentro dele
Árvore de perfisRestrição: o filho só recebe permissões que o pai tem. Não há herança
UtilizadorVários perfis por atribuição (com expiração opcional); um perfil ativo
Permissões no JWTSó as diretas do perfil ativo; org é o departamento dele
Troca de perfilRevoga as sessões; o token seguinte traz as permissões do novo perfil
Nome das permissõesConvenção igrp.{domínio}.{ação}, global, não imposta
InvalidaçãoAlterações estruturais revogam as sessões afetadas; algumas também limpam a cache de permissões
How is this guide?

Última atualização: