RBAC Fundamentals
- Core Concepts
- Default Roles
- Roles: Sets of permissions that can be assigned to users
- Subjects: Resources that can be acted upon (pages, files, events, etc.)
- Actions: Operations that can be performed on subjects (read, create, update, etc.)
- Rules: Define which roles can perform which actions on which subjects
- Conditions: Optional criteria that further restrict when rules apply
Managing Roles and Rules
Accessing RBAC Settings
- Go to your workspace
- Navigate to Settings > Advanced > Manage Roles
- Edit the YAML configuration
- Save your changes
Defining Roles
auth section allows you to automatically assign roles based on authentication providers.Creating Rules
- action: What can be done (a single action or list)
- subject: What it can be done to (a single subject or list)
- role: Which role this applies to (if omitted, applies to everyone)
- conditions: Restrict the rule to specific cases. If omitted (or an empty object), the rule will apply to every instance of specified subject
- inverted: Set to
trueto make this a deny rule instead of allow - reason: Documentation string for the rule
Adding Conditions
Common RBAC Patterns
Public Access
Public Access
role specified apply to everyone, including unauthenticated users.Role-Based Access
Role-Based Access
API Key Permissions
API Key Permissions
The api key value can’t be directly accessed, but instead can be injected in
fetch instruction :Automatic assignment
Automatic assignment
Subjects and Actions
RBAC controls access to various resource types through subject and action combinations:Workspaces
Workspaces
workspacesActions :read: allows reading the workspace configurationupdate: allows updating the workspace configurationdelete: allows deleting the workspacemanage_security: allows updating security configurationmanage_permissions: allows sharing / unsharingaggregate_search: allows using /search APIget_usage: allows using /usage APImanage_repositories: allows managing repositories settingsmanage: allows all above actions
Pages
Pages
pagesActions :create: allows creating a pageread: allows reading pagesupdate: allows updating pagesdelete: allows deleting pagesmanage: allows all above actions
Files
Files
filesActions :create: allows uploading a fileread: allows reading filesupdate: allows updating filesdelete: allows deleting filesmanage: allows all above actions
Events
Events
eventsActions :create: allows emitting an eventread: allows reading eventsmanage: allows all above actions
Automations
Automations
automationsActions :create: allows creating an automationread: allows reading automationsupdate: allows updating automationsdelete: allows deleting automationsexecute: allows executing automationsmanage: allows all above actions
Secrets
Secrets
secretsActions :create: allows creating secretsread: allows reading secretsupdate: allows updating secretsdelete: allows deleting secretsmanage: allows all above actions
Secure secrets
Secure secrets
secure_secretsActions :create/update: allows depositing a credentialread: allows replaying one, which only an automation taking on a role can do
{{secret.*}} and never handed back to a caller, whatever the rule says. What a rule must prove depends on who it applies to. See Secure secrets below.Apps
Apps
appsActions :create: allows publishing an appread: allows viewing/installing appsupdate: allows updating appsdelete: allows deleting appsmanage: allows all above actions
Secure secrets
Secure secrets store credentials: an OAuth refresh token a member deposits when connecting their account, an API key a connector needs. Two rules describe their lifecycle, and they are deliberately asymmetric.Letting members deposit their own credential
${user.id}, anchored, with every other character a literal. Without it, one rule would let any member overwrite every other member’s credential.
A single fixed-width character class such as [a-f0-9]{16} is allowed, so a connector can hold one credential per remote account rather than one per person. Its width must be fixed: with a variable one, two different pairs could spell the same name.
manage is never grantable here, and delete only to a role (below). read is accepted, but a rule carrying no role applies to every member, so granting it here would let each of them read all the others’ credentials — the platform lets you write it and does not recommend it.
Letting an automation replay them
A scheduled synchronisation, or any automation acting for the workspace rather than for its caller, has no user behind it. It cannot read a credential under anyone’s permissions, which is exactly the problem: the tokens the workspace’s own members deposited are unreadable to its own sync. Nothing about the shape of a run answers that. An unauthenticated cron and an unauthenticated HTTP call are indistinguishable, so the workspace states it instead: it declares a role, and the automation takes that role on for the one call that needs it.delete belongs there for the same reason as the write: a connector that sees a token rejected for good drops it, so the run stops retrying and the member is asked to reconnect. It is grantable only to a role — on a rule that applies to every member it would hand each of them the right to destroy the others’ credentials.
assumeRole applies to that single call. Everything around it keeps the caller’s own rights, and nothing is carried to the automations it calls, to an emit, or across a workspace boundary.
What each rule has to prove
The two rules above look alike and answer different questions. A rule carried by no role lands ondefault, which applies to every member. Writing a name they choose would let one member overwrite another’s credential, so ${user.id} is mandatory there: it is the only thing keeping members apart.
A rule carried by a role applies to whoever takes it on, which is an automation acting for the workspace. It may name a family of secrets instead, for reads and writes alike. Reads, because a synchronisation serves everyone and there is no user to bind to. Writes, because providers that rotate their refresh tokens hand back a new one that has to be stored for a member who is not there.
A family pattern must carry a literal prefix of at least six characters ending on a separator, and can never reach the reserved prismeai_ namespace.
Two things remain out of reach whatever the role. Secrets of scope: user belong to a person, and a run without one is refused before permissions are even consulted. And owner cannot be assumed at all, so a developer has to declare a role that states what it opens rather than reaching for everything.
Securing Automations
By default, anyone can execute any automation that has an event or endpoint trigger. To restrict access to sensitive automations:Define Authorization Action
authorizations.action field specifies a permission key for this automation.Create Permission Rule
Test the Restriction
- Users with the admin role can execute the automation
- Users without the admin role receive an authorization error
- The automation cannot be called indirectly by other automations without permission
Using API Keys
External API Keys
External API Keys
- Use Prismeai APIs to generate an api key :
- Include the received apikey in
x-prismeai-api-keyheader :
Workspace API Keys
Workspace API Keys
Example RBAC Configuration
Here’s a complete example of a typical RBAC configuration:Full RBAC Example
Full RBAC Example
Security Best Practices
Principle of Least Privilege
Give users only the permissions they actually need:
- Start with minimal permissions and add as required
- Use specific conditions to limit rule scope
- Avoid “manage” permission when more specific actions suffice
- Regularly review and prune unnecessary permissions
Secure Public Access
Carefully control what unauthenticated users can do:
- Use explicit conditions on public rules
- Limit event creation to specific event types
- Be cautious with file upload permissions
- Restrict user session events appropriately
Protect Sensitive Automations
Secure automations that access sensitive data:
- Add authorization requirements to important automations
- Create specific roles for administrative functions
- Avoid sensitive data exposure through events
- Test automations with different user roles
Manage API Access
Control programmatic access carefully:
- Create API keys with minimal required permissions
- Rotate API keys regularly
- Monitor API key usage for unusual patterns
- Delete unused API keys promptly
Troubleshooting
Access Denied Unexpectedly
Access Denied Unexpectedly
- Verify the user has the correct role assignment
- Look for inverted rules (deny rules) that might be applying
- Check if conditions on rules are unintentionally restrictive
- Ensure the rule order places more specific rules after general ones
Too Much Access
Too Much Access
- Look for overly broad rules without conditions
- Check if the user has multiple roles granting cumulative permissions
- Verify automatic role assignment isn’t giving unintended access
- Ensure public rules (no role specified) aren’t too permissive