# ACL > Access Control List system for permission storage and inheritance in Cognee # ACL: Permission Storage and Inheritance The ACL (Access Control List) system stores all permissions and handles permission checking at runtime. ACL entries are stored in the `acls` table, with each row linking a [principal](./principals) to a [dataset](./datasets) with a specific permission. **Runtime permission calculation** — The system doesn't store "effective permissions" anywhere—it calculates them on demand by querying ACL entries. ## How ACL Works When a [user](./users) tries to access data, the system queries all relevant ACL entries and aggregates the permissions. The permission checking function `get_all_user_permission_datasets()` unions the [user](./users)'s direct permissions with those inherited from their [tenant](./tenants) and [roles](./roles), combining all three sources: direct [user](./users) permissions, [tenant](./tenants)-level permissions, and [role](./roles)-level permissions. This approach ensures permissions are always current and allows for complex permission inheritance without data duplication. ## ACL Storage Schema The ACL system uses a simple but powerful schema to store permissions: The ACL model defines what gets stored in the SQL database. The `acls` table contains: * `id`: Unique identifier (UUID primary key) * `principal_id`: References the [principal](./principals) ([user](./users), [tenant](./tenants), or [role](./roles)) * `dataset_id`: References the [dataset](./datasets) * `permission_id`: References the permission type * `created_at`: Timestamp when created * `updated_at`: Timestamp when last modified * `get_all_user_permission_datasets(user, permission)`: Queries ACL entries and returns [datasets](./datasets) the [user](./users) can access * `give_permission_on_dataset(principal, dataset_id, permission)`: Creates or updates ACL entries ## Permission Resolution Order The system evaluates permissions in a specific order: 1. **Direct [user](./users) permissions** — Explicitly granted to the [user](./users) 2. **[Role](./roles) permissions** — Inherited through the [user](./users)'s role memberships 3. **[Tenant](./tenants) permissions** — Inherited through the [user](./users)'s tenant membership This order allows for flexible permission management where more specific permissions can override broader ones. ## ACL Operations The ACL system supports several key operations: * **Grant permissions** — Add new ACL entries to grant access * **Revoke permissions** — Remove ACL entries to revoke access * **Check permissions** — Query ACL entries to determine access * **List permissions** — Get all permissions for a principal or dataset ## Permission Inheritance The ACL system implements a three-tier inheritance model: * **User level** — Direct permissions granted to individual users * **Role level** — Permissions granted to roles, inherited by role members * **Tenant level** — Permissions granted to tenants, inherited by all tenant members Users receive the union of all permissions from these three sources, giving them the most permissive access available. ## Performance Considerations The ACL system is designed for performance: * **Indexed queries** — Database indexes on principal\_id, dataset\_id, and permission\_id * **Efficient lookups** — Single query to get all permissions for a user * **Caching opportunities** — Permission results can be cached for frequently accessed datasets * **Batch operations** — Support for granting/revoking multiple permissions at once ## Security Features The ACL system includes several security features: * **Immutable ownership** — Dataset ownership cannot be changed * **Permission validation** — All permission checks go through the ACL system * **Audit trail** — All permission changes are logged with timestamps * **Isolation** — Users can only access datasets they have permissions for ## Troubleshooting Common ACL-related issues and solutions: * **Permission denied** — Check if user has required permission on the dataset * **Missing permissions** — Verify ACL entries exist for the principal and dataset * **Inheritance issues** — Check role and tenant memberships * **Performance problems** — Review database indexes and query patterns See practical snippets of ACL operations Learn how to configure ACL and multi-tenant mode --- > To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.cognee.ai/llms.txt