You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A property_ids claim via a hardcoded-claim mapper, because PropertyScopeGuard admits by claim (or platform-admin role) — this is genuinely nice design, but undocumented for the service-account case.
Realm roles per controller (reservations, revenue_manager, …) — fine.
A local users row for any @RequirePermissions route: PermissionsGuard.findLocalUser resolves by keycloak_sub then email, and a service account has no email — so integrators must insert a row (keycloak_sub = the service account's user id) plus a local role with permission keys. There's no API for this; we did it with operator SQL.
Suggestion: either a documented "integration principal" setup path (docs + maybe a CLI/seed helper that creates client-with-mappers + users row + a narrow local role in one step), or a service-principal concept that bypasses the local-user resolution for token types that can't have one. Also worth considering: a narrower built-in role for room/room-type management — today the room controllers require general_manager/admin, so any tooling that manages inventory needs one of the two broadest roles in the realm.
One error message earned praise from our infra reviewer along the way: "No local user account is linked to this login" names its guard exactly — worth preserving through any refactor.
Design ask, following #317 and #321: a first-class service principal story for server-to-server integrations.
What an integrator currently has to assemble by hand (all measured, all working — but every piece was archaeology):
audto contain the primary client).azpacceptance — impossible until feat(auth): KEYCLOAK_ALLOWED_AZP — let additional realm clients call the API #317; the guard hard-requires the browser client's identity.property_idsclaim via a hardcoded-claim mapper, becausePropertyScopeGuardadmits by claim (or platform-admin role) — this is genuinely nice design, but undocumented for the service-account case.reservations,revenue_manager, …) — fine.usersrow for any@RequirePermissionsroute:PermissionsGuard.findLocalUserresolves bykeycloak_subthen email, and a service account has no email — so integrators must insert a row (keycloak_sub= the service account's user id) plus a local role with permission keys. There's no API for this; we did it with operator SQL.Suggestion: either a documented "integration principal" setup path (docs + maybe a CLI/seed helper that creates client-with-mappers + users row + a narrow local role in one step), or a service-principal concept that bypasses the local-user resolution for token types that can't have one. Also worth considering: a narrower built-in role for room/room-type management — today the room controllers require
general_manager/admin, so any tooling that manages inventory needs one of the two broadest roles in the realm.One error message earned praise from our infra reviewer along the way:
"No local user account is linked to this login"names its guard exactly — worth preserving through any refactor.