Skip to content

Authorization Reference

dbward uses role-based access control (RBAC) with database and environment scoping.

RolePermissionsScope
admin* (all permissions)All
requesterrequest.dml, request.ddl, request.query, request.view:own, request.cancel:own, request.resume:own, request.preflight, request.preflight_explain, result.view:own, schema.read, workflow.read, token.create, token.revoke:ownAll
approverrequest.view:own, result.view:own, schema.read, workflow.read, token.create, token.revoke:ownAll
operatorrequest.query, request.dml, request.ddl, request.view:any, request.cancel:any, request.resume:any, request.break_glass_query, request.break_glass_dml, request.break_glass_ddl, result.view:any, schema.read, audit.read, metrics.view, workflow.read, token.create, token.revoke:ownAll
agent-defaultagent.operateAll

Built-in roles cannot be redefined in config.

[[auth.roles]]
name = "dba"
permissions = ["request.dml", "request.view", "result.view", "audit.read"]
databases = ["app", "analytics"] # Scope to specific databases (empty = all)
environments = ["production", "staging"] # Scope to environments (empty = all)

Custom role permissions only apply within the specified databases and environments scope. If both are empty, the role applies globally.

Groups are named collections of users with associated roles. Members inherit the group’s roles. Groups are also used as approvers in workflow steps:

[[auth.groups]]
name = "backend-team"
roles = ["requester"]
[[auth.groups]]
name = "dba-team"
roles = ["dba"]

Groups are referenced in workflows:

[[workflows.steps.approvers]]
group = "dba-team"
min = 1

Users are added to groups via dbward user add --group or dbward user update --add-group.

Roles are assigned to users in two ways:

Assign roles directly when creating or updating a user:

Terminal window
dbward user add alice --role dba
dbward user update alice --add-role admin

Roles are stored in the user record (roles_json column).

Users inherit roles from their group memberships. Groups define their roles in config:

[[auth.groups]]
name = "dba-team"
roles = ["dba", "requester"]

When a user belongs to dba-team, they automatically receive the dba and requester roles.

A user’s effective roles = direct roles ∪ group-derived roles. For token authentication, effective roles are further intersected with the token’s scope_ceiling.

Assign a role to all authenticated users who don’t have an explicit role (neither direct nor group-derived):

[auth]
default_role = "requester"
PermissionDescription
request.dmlCreate requests (DML, migrations)
request.ddlCreate requests containing DDL (CREATE/ALTER TABLE, CREATE VIEW/INDEX, DROP TABLE/VIEW/INDEX/SEQUENCE, TRUNCATE, CREATE SEQUENCE)
request.queryCreate SELECT-only requests
request.resumeResume approved requests
request.cancelCancel own requests
request.viewView requests and status
request.break_glass_queryUse emergency bypass (SELECT only)
request.break_glass_dmlUse emergency bypass (DML/writes)
request.break_glass_ddlAllow DDL in emergency mode (requires request.break_glass_dml)
request.preflightRun preflight SQL analysis
request.preflight_explainRun preflight with EXPLAIN
PermissionDescription
result.viewView query results
PermissionDescription
audit.readView audit events
PermissionDescription
workflow.readView workflow definitions
workflow.writeCreate/update/delete workflows
policy.writeManage execution/result/notification policies
role.writeCreate/delete custom roles via API
webhook.writeCreate/update/delete webhooks
PermissionDescription
user.writeAdd, update, suspend, activate, and delete users
user.readList and view users and groups
token.createCreate tokens for yourself
token.revokeRevoke own tokens
token.listList all tokens
token.create_agentCreate agent tokens
token.reissueReissue initial tokens for other users
PermissionDescription
agent.operatePoll, claim, heartbeat, and submit results
PermissionDescription
metrics.viewAccess /metrics endpoint
*All permissions (admin only)

Selectors identify principals in workflow approvers and result access:

FormatExampleMatches
role:<name>role:dbaUsers with the named role
group:<name>group:backend-teamMembers of the named group
user:<subject>user:aliceSpecific user by subject ID
requesterrequesterThe user who created the request

Map OIDC claims to dbward roles:

[[auth.oidc.role_mappings]]
claim = "groups"
value = "engineering"
role = "requester"
[[auth.oidc.role_mappings]]
claim = "groups"
value = "platform"
role = "admin"

OIDC users are auto-provisioned on first login (JIT). Their roles are resolved from OIDC role mappings + group membership + default_role.