Overview
Kolibri implements a comprehensive class-based permission system that controls access to resources based on user roles, facility membership, and object relationships. The permission system is built around collections (facilities, classrooms, learner groups) and roles (admin, coach).Permission Architecture
Core Concepts
Collections: Hierarchical organizational units- Facility - Top-level organization (school, learning center)
- Classroom - Class or course within a facility
- LearnerGroup - Subset of learners within a classroom
- AdHocLearnersGroup - Temporary group for specific assignments
- Admin - Full management permissions for a facility
- Coach - Teaching and monitoring permissions for classrooms
- Superuser - Device-level administrator (not facility-specific)
- Users can be members of multiple classrooms and groups
- Membership in a child collection implies membership in parent collections
Permission Classes
Kolibri uses permission classes that inherit fromBasePermissions. Each permission class defines CRUD (Create, Read, Update, Delete) operations.
Base Permission Classes
BasePermissions
The foundation class that all permission classes inherit from:RoleBasedPermissions
Permissions based on a user’s role for a collection:Common Permission Classes
DenyAll
Denies all access - useful as a default or for internal-only resources:AllowAll
Allows all access - use with caution, typically for public resources:IsSelf
Only allows access if the object IS the requesting user:IsOwn
Allows access if the object belongs to the requesting user:IsAdminForOwnFacility
Allows access if the user is an admin for the facility the object belongs to:Combining Permissions
Permission classes can be combined using| (OR) and & (AND) operators:
API Permission Enforcement
KolibriAuthPermissions
The standard DRF permission class used in Kolibri viewsets:- Checks
user.can_create()for POST requests - Checks
user.can_read()for GET requests - Checks
user.can_update()for PUT/PATCH requests - Checks
user.can_delete()for DELETE requests
KolibriAuthPermissionsFilter
Filter backend that limits querysets to readable objects:user.filter_readable() to return only objects the user can read.
Permission Checking in Code
Check permissions programmatically using methods on the user object:Role Management
Role Kinds
Checking Roles
Role Hierarchy
Roles inherit down the collection hierarchy:- Facility Admin → Can manage everything in the facility (all classrooms, groups, users)
- Classroom Coach → Can manage assigned classroom(s) and learner groups within
- No Role (Learner) → Can only access assigned content and view own progress
User Types
Kolibri distinguishes between several user types:Superuser vs Admin
-
Superuser (
is_superuser=True): Device-level administrator- Can manage device settings
- Can create/delete facilities
- Not tied to a specific facility
- Access all facilities on the device
-
Admin (has admin role): Facility-level administrator
- Can manage users, classes, and content within their facility
- Cannot access other facilities
- Cannot change device settings
Permission Scenarios
Scenario 1: Coach Managing Classroom
Scenario 2: Learner Accessing Own Progress
Scenario 3: Admin Managing Users
Scenario 4: Cross-Facility Access
API Permission Responses
Success (200/201)
Request permitted and processed successfully.Forbidden (403)
User is authenticated but lacks required permissions:Unauthorized (401)
User is not authenticated:Not Found (404)
Object doesn’t exist OR user lacks read permissions (returns 404 instead of 403 to avoid information leakage).Best Practices
1. Use Appropriate Permission Classes
Choose the most restrictive permission class that meets your needs:2. Filter Querysets Properly
Always use permission filters on list endpoints:3. Check Permissions Before Actions
Explicitly check permissions for custom actions:4. Don’t Leak Information
Return 404 instead of 403 when object shouldn’t be visible:5. Test Permission Boundaries
Test permission edge cases:Debugging Permissions
When permission checks fail unexpectedly:-
Check user roles: Verify the user has the expected role
-
Check collection hierarchy: Ensure objects are in the correct collection
-
Test permission methods directly:
-
Check filter results:
Related Documentation
- Authentication - User login and session management
- Facility Management API - Managing facilities and settings
- User Management API - CRUD operations on users and roles