Configure Roles and Permissions
CRAFT uses OpenFGA for Relationship-Based Access Control (ReBAC). This guide covers setting up roles, assigning permissions, and configuring the permission inheritance model across organizations, projects, and resources.Prerequisites
Before you begin, ensure you have:
- A running CRAFT with the Governance service bootstrapped
- Administrative access (the
adminorownerrole on the target organization) - A valid JWT token for the admin user
- The OpenFGA schema loaded during Governance bootstrap
How Permissions Work
The platform uses a relationship-based model rather than traditional role-based access control. Permissions are computed at query time from relationships between users, roles, and resources.Role Hierarchy
| Role | Scope | Capabilities |
|---|---|---|
owner | Organization | Full control, can transfer ownership, manage all settings |
admin | Organization / Project | Manage users, projects, settings. Cannot transfer organization ownership |
member | Project | Standard access to project resources |
developer | Project | Create and modify agents, data connections, workflows |
operator | Project | Deploy, schedule, and monitor resources |
viewer | Project | Read-only access to all resources |
Computed Permissions
Permissions are derived from roles via the OpenFGA schema:| Permission | owner | admin | member | developer | operator | viewer |
|---|---|---|---|---|---|---|
can_read | Yes | Yes | Yes | Yes | Yes | Yes |
can_write | Yes | Yes | Yes | Yes | No | No |
can_delete | Yes | Yes | No | No | No | No |
can_execute | Yes | Yes | Yes | Yes | Yes | No |
can_manage_secrets | Yes | Yes | No | No | No | No |
Step 1: Understand the OpenFGA Schema
The permission model is defined in the OpenFGA Schema DSL. Key type definitions used by the platform:Step 2: Grant a role on a resource
The Governance API exposes a single grant endpoint that is used for every role-on-resource combination — there is no separate “add organization member” or “add project member” endpoint. A “role assignment” is a tuple(user_or_group, relation, resource_type:resource_id) written to the OpenFGA
store via POST /governance/permissions/grant.
- API
- Python SDK
200 OK):resource_type to project and resource_id to the project UUID:artifact, data_connection,
secret, etc. The relation must be one of the role names defined
on that resource type in the OpenFGA schema (Step 1).Permission Inheritance
Roles inherit downward through the hierarchy because the OpenFGA schema expresses each role on a child as derivable from its parent:Organization owner
Automatically has admin-level permissions on all projects and resources within the organization.
Organization admin
Automatically has admin-level permissions on all projects. Can create and delete projects.
Project developer
Has
can_read, can_write, and can_execute on all resources within the specific project. Cannot delete resources or manage secrets.Step 3: Check or list permissions
Two read endpoints answer the common questions:200 OK): the response body for an allowed call is null
(absence of a 403 body means the action is permitted). A denied check
returns 403 Forbidden.
200 OK):
<resource_type>:<resource_id>, with resource_id echoing
the canonical resource_uri for agent / data_connection /
artifact resources.
Step 4: Revoke a role
POST /governance/permissions/revoke mirrors grant:
200 OK):
POST /governance/permissions/delete-all:
deleted_count so you can confirm the sweep.
Common Permission Patterns
Data team with read-only analytics access
Data team with read-only analytics access
Assign
viewer on the project containing data connections and dashboards. Users can run queries via Data Insights but cannot modify data connections or agent configurations.DevOps team managing deployments
DevOps team managing deployments
Assign
operator on the target project. Operators can deploy agents, trigger schedules, and monitor health, but cannot modify agent code or data connection credentials.Service accounts for CI/CD
Service accounts for CI/CD
Create Keycloak client credentials and assign
developer or operator on the target project. Service accounts authenticate via client credentials grant and have the same permission model as human users.Cross-project access
Cross-project access
A user can have different roles on different projects within the same organization. Assign roles per project to implement least-privilege access.
Integration with SSO Groups
When SSO is configured, IdP groups map through Keycloak to OpenFGA:Troubleshooting
Permission checks returning 403
Permission checks returning 403
Verify the OpenFGA schema is loaded by checking Governance bootstrap logs. Ensure the user’s JWT contains the correct groups claim. Confirm the user has been assigned a role on the target project.
Inherited permissions not working
Inherited permissions not working
Check that the project has a
parent relationship to the organization in OpenFGA. This is set automatically when projects are created via the Governance API.Role changes not taking effect
Role changes not taking effect
OpenFGA evaluates permissions at query time — there is no caching delay. If changes are not reflected, verify the role assignment was successful by listing members on the project.
Next Steps
SSO Integration
Configure SSO to automate group-to-role mapping from your IdP.
Authorization Deep Dive
Learn about the full OpenFGA schema and computed permissions model.
Multi-Tenancy
Understand how permissions integrate with the multi-tenant architecture.
Security Overview
Review the complete security model including authentication and data protection.

