# Roles
> Role-based permissions within tenants for granular access control
# Roles
A role is a group of [users](./users) within a [tenant](./tenants). [Roles](./roles) can be granted permissions on [datasets](./datasets), which apply to their members. This enables fine-grained access control within organizations and makes it easier to manage permissions for different teams.
**Role-based permissions** — When a role is granted a permission on a dataset, all users assigned to that role inherit that permission.
## Role Concept
[Roles](./roles) are created by [tenant](./tenants) owners and are scoped to that specific [tenant](./tenants). The role belongs to exactly one [tenant](./tenants) as soon as it's created. Because of that foreign-key link, a role can't be moved or shared with another [tenant](./tenants); you would need to create a new role under the other [tenant](./tenants) instead.
[Users](./users) can be assigned to multiple [roles](./roles) within their [tenant](./tenants), and [roles](./roles) can contain multiple [users](./users). This many-to-many relationship allows flexible permission management across teams.
## Role-Based Permissions
When a [role](./roles) is granted a permission on a [dataset](./datasets), all [users](./users) assigned to that role inherit that permission. [Users](./users) receive the union of their direct permissions, [tenant](./tenants)-level permissions, and [role](./roles)-level permissions.
[Roles](./roles) allow you to create permission groups like "editors" or "viewers" within a [tenant](./tenants), making it easier to manage access for different teams without granting permissions to individual [users](./users).
The Role model defines what gets stored in the SQL database. The `roles` table contains:
* `id`: Unique identifier (UUID primary key, references principals.id)
* `name`: Human-readable name (unique within tenant)
* `tenant_id`: ID of the tenant this role belongs to (required)
* `create_role(role_name, owner_id)`: Creates a new role (tenant owner only)
* `add_user_to_role(user_id, role_id, owner_id)`: Assigns a user to a role (tenant owner only)
* Roles are tenant-scoped and cannot cross tenants
* API endpoints for role management
## Role Management
Tenant owners can:
* Create roles within their tenant
* Assign users to roles
* Remove users from roles
* Grant permissions to roles
* Delete roles (when no longer needed)
## Common Role Patterns
Roles are typically organized around job functions or responsibilities:
* **Editors** — Can modify content and run cognify operations
* **Viewers** — Can only read and search data
* **Administrators** — Can manage permissions and users
* **Project Managers** — Can access specific project datasets
* **Reviewers** — Can read and provide feedback on content
## Permission Inheritance Hierarchy
Users receive permissions through a three-level hierarchy:
1. **Direct permissions** — Explicitly granted to the user
2. **Role permissions** — Inherited through role memberships
3. **Tenant permissions** — Inherited through tenant membership
The system calculates effective permissions by combining all three sources, giving users the most permissive access available to them.
## Best Practices
* **Create meaningful role names** — Use descriptive names that reflect the role's purpose
* **Keep roles focused** — Each role should have a clear, specific purpose
* **Regular role reviews** — Periodically review and update role assignments
* **Document role purposes** — Keep clear documentation of what each role is for
* **Principle of least privilege** — Grant only the minimum permissions necessary
## Role vs Tenant Permissions
* **Tenant permissions** — Broad, organization-wide access
* **Role permissions** — Specific, team-based access within the tenant
* **Direct permissions** — Individual, user-specific access
This three-tier system allows for flexible and scalable permission management.
Learn how permissions are stored and checked
See practical snippets of role-based permissions
---
> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.cognee.ai/llms.txt