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:
- Rota sem
@Permissions→ liberada. isSuperAdmin(role de realmsuper_admin) → bypass total.- Sem nenhuma permissão →
403 Forbidden(NotAllowedError). - Caso contrário, exige uma permissão cujo
rsnameseja igual aoresourcee cujosscopescontenham oscopeda rota.
Resources
Definidos em Resource (src/domain/auth/application/enums/resource.enum.ts).
Recursos de coleção e recursos "por id" são distintos:
| Resource | Valor (rsname) | Usado em |
|---|---|---|
Resource.Customers | resource:customers | criar / listar customers |
Resource.CustomersById | resource:customers_id | obter / editar / excluir por id |
Resource.Tenants | resource:tenants | criar / listar tenants |
Resource.TenantsById | resource:tenants_id | obter / editar / excluir por id |
Resource.Apps | resource:apps | criar / listar apps |
Resource.AppsById | resource:apps_id | obter / editar / excluir por id |
Resource.Users | resource:users | criar / listar usuários |
Resource.UsersById | resource:users_id | obter / editar / excluir por id |
Resource.Cooperatives | resource:cooperatives | listar cooperativas |
Resource.AuditLogs | resources:audit-logs | logs de auditoria |
Scopes
Definidos em Scope:
| Scope | Valor | Operação HTTP típica |
|---|---|---|
Scope.Create | create | POST |
Scope.Read | read | GET |
Scope.Update | update | PUT |
Scope.Delete | delete | DELETE |
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.