rbac

Role-Based Access Control. Defines the role → verb grants and the post-login landing route per role. Full behavior reference (verb vocabulary, grant matching, where each verb gates) is in Access Control → RBAC: Roles & Verbs; this page is the horizon.yaml shape.

Shape

rbac:
  enabled: true
  roles:
    viewer:     [metrics:read, alarms:read, traces:read, logs:read, topology:read, profile:read]
    maintainer: [metrics:read, alarms:read, traces:read, logs:read, topology:read, profile:read, cluster:read, inspect:read]
    operator:   [metrics:read, ..., rule:*, live-debug:*, profile:enable]
    admin:      ["*"]
  landingByRole:
    viewer: /
    maintainer: /operate/cluster
    operator: /
    admin: /operate/cluster

Fields

Field Type Default Required Notes
enabled boolean true no When false, every authenticated session is granted * (full access). Useful for dev. Set true in production.
roles object the four built-ins no Custom role definitions. Keys are role names; values are arrays of permission strings. Omitting this block uses the four built-ins (viewer, maintainer, operator, admin) — see horizon.example.yaml for the full grants. Defining the block at all overrides the built-ins entirely; redefine all four if you want to keep them.
landingByRole object see below no Post-login redirect route per role. First role on the user wins.

Built-in roles (used when roles is not set)

Role Purpose Grants
viewer Read-only data catalog. metrics:read, alarms:read, traces:read, logs:read, topology:read, profile:read. Deliberately not *:read so the viewer cannot see rule definitions, live-debug sessions, setup screens, or platform internals.
maintainer Viewer + platform monitoring. viewer baseline + cluster:read, inspect:read.
operator Configures observability. maintainer baseline + overview:read/write, setup:read/write, dashboard:read/write, alarm-setup:read/write, alarm-rule:read/write, rule:* (including rule:write:structural, rule:delete, rule:debug), live-debug:*, profile:enable.
admin Unrestricted. *.

Verb grammar

Grants are dot-namespaced strings. Four matching modes:

Pattern Meaning
* or admin Matches any verb (admin).
area:verb Exact match: e.g., rule:write grants exactly rule:write.
area:* Matches any verb in that area: rule:* grants rule:read, rule:write, rule:write:structural, rule:delete, rule:debug.
*:read Matches the read action across any area.

A user’s effective verbs are the union of all grants from all their roles.

landingByRole

Default:

landingByRole:
  viewer: /
  maintainer: /operate/cluster
  operator: /
  admin: /operate/cluster

The login flow returns this route as landingRoute in the login response. The UI router uses it as the post-login destination unless a ?redirect= query param overrides (e.g., the user was bounced to login from a protected route — they return there after auth).

Common shapes

Loosen for dev

rbac:
  enabled: false   # all authenticated users get full access

Add a custom role

rbac:
  enabled: true
  roles:
    viewer:     [...]
    maintainer: [...]
    operator:   [...]
    admin:      ["*"]
    on-call:                          # custom
      - metrics:read
      - alarms:read
      - traces:read
      - logs:read
      - topology:read
      - inspect:read                  # so they can poke at the catalog
      - live-debug:read               # but not write
  landingByRole:
    on-call: /alarms                  # land directly on the alarm board

Custom roles are usable from both backends: assign to local users via auth.local.users[].roles, or map LDAP groups via auth.ldap.groupMappings.

Hot reload behavior

Changes to rbac.roles and rbac.landingByRole apply on the next route evaluation — existing sessions pick up new grants without re-login. The session’s role list is the authoritative source; the verb set is computed per request from roles → rbac.roles at policy check time.

rbac.enabled: false → true and vice versa also applies on next request, with no session invalidation.

Enforcement

Verb checks happen on the BFF, not the UI. The UI hides controls based on the verbs the session reports, but a malicious client cannot escalate by calling the API directly — the BFF re-checks every request. See Access Control → Admin Pages for the Roles & Permissions read-only board that visualizes the live policy.