Groundfloor Docs

ReBAC Model

Relationship-based access control in Control Plane — roles, actions, and SpiceDB enforcement.

Control Plane authorization is relationship-based (ReBAC), enforced by SpiceDB. Role names like owner and member are stored as relationships; API handlers check a closed action vocabulary against resource types.

Resource types

SpiceDB typeMaps toTypical scope
portal_userHuman userSubject of all checks
portal_accountAccount (billing org)Top-level tenant
portal_workspaceWorkspaceData + apps boundary
portal_environmentEnvironmentDeploy target (dev/staging/prod)

Types are prefixed portal_ because SpiceDB is shared with Dataplane tenant schemas — the prefix prevents collisions.

Membership roles

Users hold roles on accounts and workspaces via SpiceDB relationships:

RelationOnGrants
owneraccount, workspaceFull administration
billing_adminaccountBilling + administer
adminworkspaceWorkspace administration
writerworkspaceRead + write + delete on data pillars
memberaccount, workspaceRead access
deployerenvironmentDeploy to that environment

The Customer Portal Members & Roles page maps to memberships rows in Postgres, which are kept in sync with SpiceDB tuples.

Closed action vocabulary

Handlers call check(action, resource_type, resource_id) with one of:

ActionValid on
administeraccount, workspace
readaccount, workspace, environment
writeworkspace
deleteworkspace
ddlworkspace
deployworkspace, environment
manage_membersaccount, workspace
view_billingaccount

A 403 from the API means SpiceDB denied the action — the JWT was valid but the user lacks the relationship.

Adding a new action requires a schema change, authorization code update, and documentation — all in the same change. See SpiceDB schema.

How checks run

PathSpiceDB consulted?
GET /v1/workspaces/{id}Yes — per-record check
GET /v1/workspaces (my workspaces)Indirect — filtered via memberships table
Workspace pillar APIsYes — action per endpoint

Control Plane talks to SpiceDB via direct gRPC — not through Dataplane.

Customer Portal mapping

Portal areaTypical action
Accounts listread on account
Create workspaceadminister on account
Data Vault writewrite on workspace
Secrets revealread + audited
Members add/revokemanage_members

On this page