Skip to main content
CID222 Docs

Roles at a glance

The five fixed roles, what each is for, how much data each one sees, and where access is actually decided.

  • Version: 0.4
  • Role: admin_user, viewer

CID222 has five roles and the set cannot be extended. Choosing the right one for an account is most of access control; the rest is subtraction. This page is the orientation — who each role is for and how much data it sees. The procedure for narrowing them lives in access control.

The problem

Two different questions get confused. "What may this person change?" is a question about the role on their account. "Which pages should this person be offered?" is a question about the page matrix. Answering the second by editing the first produces an administrator who cannot administer, or a reviewer who can.

How CID222 does it

RoleWhat it is forData it readsMutations
superadminThe appliance owner. The only role that manages accounts and edits the access matricesEverythingYes
admin_userDay-to-day administration: security policy, detections, compliance, governance, channels, platform operationsIts own account, and the members of the groups it ownsYes
normal_userAn end user of the gatewayOnly its own dataIts own only
viewerA read-only demonstration accountEverythingNone — every mutating request is refused globally with READ_ONLY_ROLE
auditorAn external reviewer signing off evidenceCompliance, governance and audit records across every account, never message contentNo

Two of these are supersets rather than lists: superadmin holds every capability by construction, and viewer reaches every read while being refused every write by the property of the request rather than by which endpoints it may call.

Where a decision is actually made

Three independent questions decide whether someone can use a page, and only the third is edited on a screen:

  1. Does this appliance have the module? The installed licence tier decides. See packages and licence tiers.
  2. Does the role reach the API behind the page? The role requirement on the controller decides. This is code, not configuration.
  3. Should the role be offered the page? The page matrix decides, and it can only subtract.

Two deliberate choices worth knowing

  • viewer sees everything and changes nothing. It satisfies any role requirement on a safe HTTP method and is treated as a global reader by the data-scoping services, so it is a demonstration and review account rather than a restricted one. Do not use it to limit what somebody can see.
  • auditor is refused the chat. An auditor holding a chat session would spend the customer's tokens and write rows into the evidence it is signing off, so the chat controller and the two session-creating handlers refuse the role with ROLE_NOT_FOR_CHAT. Session reads are untouched.

Limits and known gaps

  • The capability model is running in shadow mode. The 70-capability matrix is computed and compared on every request but enforces nothing; what is enforced today is the role requirement on the controller plus the page matrix. Read the generated capability table as the design the decorators are being reconciled against, not as live policy. The comparison is exposed at /admin/rbac/shadow-report.
  • An endpoint that declares no role requirement is reachable by any signed-in account. That is a property of a decorator-based model, and closing it in general is what the capability layer was for. The one place it was closed by hand is the chat.
  • Fleet administration is superadmin-only. Endpoint-agent fleets carry no ownership column, so under admin_user one department could rotate another's enrolment token. The fleet-ownership model that would let admin_user back in is tracked, not shipped.
  • Roles are not per-tenant scoped policy. A role decides authority; which tenant's data that authority reaches is decided separately, by scope. See multi-tenancy.

Last updated on

On this page

Download PDF