Roles and permissions

What each organization role can do, permission by permission, and how API keys and the Warden check fit in.

Loomplane has four roles per organization. They're Warden roles, checked in the service layer on every action, and each includes everything the role below it can do. A permission is named resource:action.

The roles

RoleDescription
ViewerReads everything, changes nothing. Can't see secret values
DeveloperCreates projects and environments, analyzes, edits manifests and variables, and requests deployments
AdminApproves deployments, manages members, cloud accounts and secrets
OwnerEverything, including the organization itself

Your authsome organization role maps to one of these: owner to Owner, admin to Admin, member to Developer, and anything else to Viewer, so an unexpected role never grants more than reading.

Permission matrix

An X means the role holds it.

PermissionViewerDeveloperAdminOwner
project:read, environment:read, deployment:read, infrastructure:read, cloud_account:read, member:read, variable:readXXXX
destination:read, network:read, service_backup:readXXXX
project:create, project:updateXXX
environment:manageXXX
deployment:create (request a plan)XXX
analysis:runXXX
variable:manage (project and service variables)XXX
access_grant:proposeXXX
deployment:approveXX
project:deleteXX
infrastructure:modifyXX
organization_cloud:manageXX
cloud_account:manageXX
secret:manageXX
member:manageXX
repository:connect (GitHub installations)XX
organization_variable:manageXX
service_backup:manage, service_restore:manageXX
destination:manage, network:manage, service_export:manage, access_grant:approve, access_grant:revoke, federation_trust:manageXX
organization:administerX
service_backup:retireX

The destination, network, service_export, access_grant and federation_trust permissions belong to federation, which isn't ready for production.

A secret variable's value isn't readable by anyone, whatever their role.

API keys

A key acts as the member who made it, with their role, in their organization, and never more. A read-only key fails every permission that isn't a read. Keys can't manage keys. When a member leaves or loses a role, their keys lose the same rights on the next request.

Every key expires: 90 days by default, at most 366. Keysmith stores a hash, and the key shows once. GET /api/v1/session (or loomctl whoami) shows which permissions your key has.

Where this is enforced

The dashboard hides what your role can't do, but the API checks regardless. Another organization's projects, plans, deployments, connections, variables and keys aren't found, which is the same answer as something that doesn't exist. A request's organization comes from the session or key, and the X-Loomplane-Org header the dashboard sends only helps a stale tab find out (it gets a 409), since it never selects an organization.

Organizations and roles covers the people side, and the security model covers the rest.

On this page