Profile Server API

Autorização e permissões

Como o PermissionGuard valida resource + scope contra as permissões do Keycloak.

A autorização é feita por um PermissionGuard global (registrado como APP_GUARD). Cada rota protegida declara o par resource + scope que exige, via decorator:

@Permissions(Resource.Users, Scope.Create)
@Post()
async handle(@Body() body: CreateUserBody) { /* ... */ }

Como o guard decide

Regras, na ordem:

  1. Rota sem @Permissions → liberada.
  2. isSuperAdmin (role de realm super_admin) → bypass total.
  3. Sem nenhuma permissão → 403 Forbidden (NotAllowedError).
  4. Caso contrário, exige uma permissão cujo rsname seja igual ao resource e cujos scopes contenham o scope da rota.

Resources

Definidos em Resource (src/domain/auth/application/enums/resource.enum.ts). Recursos de coleção e recursos "por id" são distintos:

ResourceValor (rsname)Usado em
Resource.Customersresource:customerscriar / listar customers
Resource.CustomersByIdresource:customers_idobter / editar / excluir por id
Resource.Tenantsresource:tenantscriar / listar tenants
Resource.TenantsByIdresource:tenants_idobter / editar / excluir por id
Resource.Appsresource:appscriar / listar apps
Resource.AppsByIdresource:apps_idobter / editar / excluir por id
Resource.Usersresource:userscriar / listar usuários
Resource.UsersByIdresource:users_idobter / editar / excluir por id
Resource.Cooperativesresource:cooperativeslistar cooperativas
Resource.AuditLogsresources:audit-logslogs de auditoria

Scopes

Definidos em Scope:

ScopeValorOperação HTTP típica
Scope.CreatecreatePOST
Scope.ReadreadGET
Scope.UpdateupdatePUT
Scope.DeletedeleteDELETE

Os valores de rsname e scopes devem corresponder exatamente à modelagem de autorização (UMA) configurada no Keycloak. Um recurso protegido na API sem a permissão equivalente no Keycloak resultará em 403 para qualquer usuário não-super_admin.