This document outlines the plan to add an optional, lightweight Role-Based Access Control system to the Cloudflare Workers Users Framework. The RBAC system will be completely optional, ensuring zero impact on existing deployments while providing powerful authorization capabilities for applications that need them.
- Optional by Default: RBAC is disabled unless explicitly enabled via environment variable
- Zero Breaking Changes: Existing deployments continue working without modification
- Performance-First: Permissions cached in session to avoid repeated database queries
- Simple Yet Flexible: Resource:action permission model (e.g., "users:read", "posts:write")
- Developer-Friendly: Easy to understand, configure, and use
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ account-pages │────▶│ user-mgmt │────▶│ session-state │
│ (Frontend) │ │ (Worker) │ │ (Worker) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ D1 Database │ │ KV Store │
│ + RBAC Tables│ │ + Permissions│
└─────────────┘ └─────────────┘
- Environment Variable:
RBAC_ENABLED=trueto enable the feature - Database Schema: Four new tables (roles, permissions, user_roles, role_permissions)
- Session Enhancement: Permissions cached in session data for performance
- Middleware:
requirePermission()middleware for route protection - Default Setup: Two default roles (SUPER_ADMIN, MEMBER) with predefined permissions
- Create RBAC database schema with migrations
- Implement core permission checking functions
- Add environment variable support
- Enhance session creation to include user permissions
- Modify session data structure to cache permissions
- Update session-state worker to handle enhanced sessions
- Create permission checking middleware
- Add middleware to protect existing endpoints (optional)
- Implement permission utilities
- Create RBAC management endpoints (/rbac/*)
- Add role assignment functionality
- Implement permission management
- Create migration scripts for existing users
- Write comprehensive documentation
- Add example implementations
- Create migration file
002-rbac.sqlwith RBAC tables- Create
rolestable (id, name, description) - Create
permissionstable (id, name, description) - Create
user_rolesjunction table - Create
role_permissionsjunction table
- Create
- Add default data migration
- Insert default permissions (admin:all, users:read, users:write, etc.)
- Insert default roles (SUPER_ADMIN, MEMBER)
- Assign permissions to default roles
- Create indexes for performance optimization
- Add
RBAC_ENABLEDto user-mgmtwrangler.toml - Add
SUPER_ADMIN_EMAILfor bootstrapping first admin - Update
Envinterface in TypeScript with new variables - Add RBAC configuration to CLAUDE.md
- Create
types/rbac.tswith RBAC-specific types- Define
Roleinterface - Define
Permissioninterface - Define
UserRoleinterface
- Define
- Update
SessionDatatype to include permissions array - Add RBAC response types for API endpoints
- Create
src/rbac/permissions.ts- Implement
getUserPermissions(userId)function - Implement
hasPermission(permissions, required)function - Implement
getUserRoles(userId)function
- Implement
- Create
src/rbac/roles.ts- Implement
assignRole(userId, roleId)function - Implement
removeRole(userId, roleId)function - Implement
createRole(name, description)function
- Implement
- Update session creation in
user-mgmt/src/session.ts- Add permission fetching when RBAC is enabled
- Include permissions in session data
- Update session-state worker handlers
- Ensure permissions are stored in KV
- Handle larger session payloads
- Create
src/middleware/rbac.ts- Implement
requirePermission(permission)middleware - Add support for checking multiple permissions
- Handle "admin:all" special permission
- Implement
- Create
requireAnyPermission(permissions)for OR logic - Create
requireAllPermissions(permissions)for AND logic
- Modify registration handler to assign default role
- Query MEMBER role ID
- Insert user_roles record on registration
- Add role assignment to user creation flow
- Create
/rbac/rolesendpoints- GET /rbac/roles - List all roles
- POST /rbac/roles - Create new role
- PUT /rbac/roles/:id - Update role
- DELETE /rbac/roles/:id - Delete role
- Create
/rbac/permissionsendpoints- GET /rbac/permissions - List all permissions
- POST /rbac/permissions - Create new permission
- Create
/rbac/users/:userId/rolesendpoints- GET /rbac/users/:userId/roles - Get user's roles
- POST /rbac/users/:userId/roles - Assign role to user
- DELETE /rbac/users/:userId/roles/:roleId - Remove role from user
- Add optional permission checks to sensitive endpoints
- DELETE /users/:id - requires "users:delete"
- PUT /users/:id - requires "users:update" or own user
- Update load-user endpoint to include roles/permissions when RBAC enabled
- Create initialization script for first admin
- Check for SUPER_ADMIN_EMAIL environment variable
- Assign SUPER_ADMIN role to specified user
- Add bootstrapping to worker startup (optional)
- Create test suite for RBAC functions
- Test permission checking logic
- Test middleware with various permission scenarios
- Test session enhancement
- Test backwards compatibility with RBAC disabled
- Create script to assign default role to existing users
- Create script to promote specific users to admin
- Document migration process for existing deployments
- Update README.md with RBAC section
- Create RBAC.md with detailed documentation
- Configuration guide
- Permission format explanation
- API endpoint documentation
- Migration guide
- Add RBAC examples to account-pages
- Update CLAUDE.md with RBAC information
- Add permission-based UI elements to account-pages
- Show/hide admin features based on permissions
- Display user's roles on profile page
- Create admin panel example (future enhancement)
- Add database indexes for permission queries
- Implement permission caching strategy
- Monitor and optimize permission query performance
- Deploy Code - Deploy new code with RBAC_ENABLED=false
- Run Migrations - Execute database migrations to create RBAC tables
- Assign Roles - Run script to assign default roles to existing users
- Bootstrap Admin - Assign SUPER_ADMIN role to designated user
- Enable RBAC - Set RBAC_ENABLED=true and redeploy
- Existing deployments work unchanged when RBAC is disabled
- New deployments can enable RBAC with minimal configuration
- Permission checks add <5ms latency to protected requests
- Clear documentation enables developers to implement RBAC quickly
- Migration path is safe and reversible
- Admin UI - Dedicated Pages application for RBAC management
- Dynamic Permissions - Runtime permission registration
- Permission Wildcards - Support for pattern matching (e.g., "posts:*")
- Audit Logging - Track permission changes and access attempts
- Session Revocation - Immediate permission revocation capability