Skip to main content

Minhas permissões — API

Três rotas de autoatendimento para o próprio usuário autenticado consultar suas permissões efetivas, sem precisar de nenhuma permissão RBAC além de estar autenticado. Não exigem tenantId/unitId na URL — o usuário é sempre o dono do access token (sub do JWT).

Funcionamento​

  • GET /me/permissions: devolve as permissões decodificadas em nomes legíveis (exam:read, report:write etc.), agrupadas em global (união de tudo), tenants[] (por tenant) e units[] (por unidade). Se o usuário for platformAdmin, global contém todo o catálogo de permissões e tenants/units vêm vazios — o administrador de plataforma não tem escopo por tenant, tem tudo.
  • GET /authorization/my-permissions: devolve o mesmo tipo de informação em formato cru (bitmask decimal por scope_id, mais platform_admin, role_ids e a revision atual). É o formato pensado para um client que já sabe decodificar bitmasks e quer decidir localmente sem round-trip a cada checagem, e para alimentar o polling de my-permissions/changed.
  • GET /authorization/my-permissions/changed: recebe a última revision que o client observou e devolve changed: true/false mais a revision atual. É a forma barata de saber se vale a pena chamar my-permissions de novo, sem decodificar nada — cada mutação relevante (papel atribuído/revogado, permissões de um papel alteradas, atribuição expirada recalculada) incrementa esse contador (authorization_version) para o usuário afetado.

As duas primeiras rotas não aceitam nenhum parâmetro: o usuário-alvo é sempre extraído do próprio token (accessToken.subject), nunca de um path ou query parameter — não há como consultar a permissão de outro usuário por aqui (para isso, ver Atribuição de papéis ou Inspeção de autorização).

Endpoints​

MétodoRotaDescrição
GET/v1/me/permissionsPermissões efetivas do usuário autenticado, por nome, agrupadas por tenant/unidade
GET/v1/authorization/my-permissionsBitmask efetivo do usuário autenticado, por escopo, com revision
GET/v1/authorization/my-permissions/changedCompara uma revision conhecida com a atual

Versão: v1

Swagger: readIdentityOwnPermissions · Identity effective permissions · Rota (Dev): http://localhost:3000/v1/authorization/my-permissions

Permissões​

RotaGuardsPermissão RBAC exigida
GET /me/permissionsIdentityOAuthAccessTokenGuardNenhuma — só autenticação
GET /authorization/my-permissionsIdentityOAuthAccessTokenGuardNenhuma — só autenticação
GET /authorization/my-permissions/changedIdentityOAuthAccessTokenGuardNenhuma — só autenticação

Nenhuma das três rotas usa AuthorizationGuard/@Authorize — a única checagem é "existe um access token válido", porque o recurso consultado é sempre o do próprio ator.

Headers​

HeaderObrigatórioDescrição
AuthorizationSimBearer <access_token>

Path parameters​

Nenhum.

Query parameters​

GET /authorization/my-permissions/changed — IdentityAuthorizationRevisionRequest:

NomeTipoObrigatórioValidação
revisionstring numéricaSim@Matches(/^\d+$/) — string de dígitos, não um número JSON

Body​

Nenhum (todas as rotas são GET).

Response​

GET /me/permissions — 200 (EffectiveIdentityPermissionsResponse):

json
{
"data": {
"isPlatformAdmin": false,
"global": ["exam:read", "report:read"],
"tenants": [ { "scopeId": "1f2a...uuid", "permissions": ["exam:read", "report:read"] } ],
"units": [ { "scopeId": "9b3c...uuid", "permissions": ["exam:read"] } ]
}
}

GET /authorization/my-permissions — 200 (IdentityOwnPermissionsEnvelopeResponse):

json
{
"data": {
"platform_admin": false,
"role_ids": ["0198f1a2-...uuid"],
"tenants": [ { "scope_id": "1f2a...uuid", "mask": "17" } ],
"units": [ { "scope_id": "9b3c...uuid", "mask": "1" } ],
"revision": "12"
}
}

GET /authorization/my-permissions/changed — 200:

json
{ "data": { "changed": true, "revision": "13" } }

Mapa de campos​

CampoTipoOnde apareceDescrição
globalstring[]/me/permissionsUnião de todas as permissões do usuário, em todo escopo; catálogo completo se platformAdmin
tenants[].scopeId / scope_iduuidambasID do tenant
units[].scopeId / scope_iduuidambasID da unidade
maskstring (bigint)/authorization/my-permissionsBitmask decimal daquele escopo — decodificável com o catálogo de bits
revisionstring numérica/authorization/my-permissions e .../changedContador de versão da autorização do usuário; muda a cada mutação relevante de papel/atribuição
role_idsuuid[]/authorization/my-permissionsIDs dos papéis ativos atribuídos ao usuário (qualquer escopo)

Erros​

Classe de erroerrorCodeStatusQuando ocorre
(validação de query)BAD_REQUEST400revision ausente ou não numérica em .../changed
UnauthenticatedErrorIDENTITY_INVALID_OAUTH_ACCESS_TOKEN401access token ausente/inválido
ForbiddenActionAUTHORIZATION_CLAIM_UNAVAILABLE403usuário sem claim de autorização ativa (/authorization/my-permissions e .../changed)

GET /me/permissions não lança 403 quando a claim está indisponível — devolve EffectiveIdentityPermissions.none() (tudo vazio, isPlatformAdmin: false) com 200. Essa é uma divergência de comportamento confirmada entre as duas rotas irmãs: uma trata "sem claim" como erro, a outra como "sem permissão nenhuma".

Regras de negócio​

IDRegraComportamento esperado
RN-01O usuário-alvo é sempre o dono do tokennenhuma das três rotas aceita consultar outro usuário
RN-02platformAdmin vê o catálogo inteiro em global, sem tenants/unitsreflete que um admin de plataforma não está escopado a tenant/unidade
RN-03/me/permissions nunca falha por falta de claimdevolve o "estado vazio" com 200, ao contrário de /authorization/my-permissions
RN-04revision é o mecanismo de invalidação de cache do clientqualquer mutação de papel/atribuição/política que afete o usuário incrementa a revision; o client deve rechamar my-permissions quando changed: true

Compliance​

Não se aplica. Rotas de leitura do próprio usuário, sem exigência regulatória adicional além da autenticação já aplicada por IdentityOAuthAccessTokenGuard.

Variáveis de ambiente​

Nenhuma variável de ambiente é consumida diretamente por estas rotas.

Tempo médio de resposta​

A confirmar — responsável: time de Identity; data: 24/09/2026. Sem medição publicada.

Requisitos não funcionais​

RequisitoDefinição
IdempotênciaSim (leitura pura)
PaginaçãoNão se aplica
Rate limitNão identificado
CacheA claim subjacente usa cache distribuído com fallback ao Postgres (ver visão geral do módulo); estas rotas não têm cache HTTP próprio
AuditoriaNão — rotas de leitura, sem evento de auditoria

Relacionado​