From 8380fbad4b617b004e2d2f19595d1490eaa1e005 Mon Sep 17 00:00:00 2001 From: Anso Date: Sun, 29 Mar 2026 17:02:56 -0400 Subject: [PATCH] feat(rbac): add Deployer & Node Admin roles with scoped permissions (Team Pro) (#253) * feat(rbac): add Deployer & Node Admin roles with scoped permissions (Team Pro) Add intermediate RBAC roles gated to Team Pro tier: - Deployer: can deploy/restart/stop/start stacks but cannot edit compose files, delete stacks, or access system settings - Node Admin: full stack and node management within scope, no system settings access - Scoped permissions: assign roles per-stack or per-node for fine-grained access control - Permission engine with checkPermission/requirePermission guards replacing requireAdmin on stack/node routes - Frontend can() function with /api/permissions/me endpoint for client-side permission checks - User management UI updated with 4-role selector and scoped permission editor - Documentation updated with permission matrix, scoped permission docs, and screenshots * fix(rbac): remove unused RoleAssignment import to fix lint error --- CHANGELOG.md | 14 + backend/src/index.ts | 284 +++++++++++++++++--- backend/src/services/DatabaseService.ts | 74 ++++- docs/features/rbac.mdx | 97 ++++--- docs/images/rbac/role-selector-dropdown.png | Bin 0 -> 82645 bytes docs/images/rbac/role-selector.png | Bin 0 -> 83483 bytes frontend/src/components/AppStoreView.tsx | 6 +- frontend/src/components/EditorLayout.tsx | 14 +- frontend/src/components/SettingsModal.tsx | 179 +++++++++++- frontend/src/context/AuthContext.tsx | 56 +++- 10 files changed, 636 insertions(+), 88 deletions(-) create mode 100644 docs/images/rbac/role-selector-dropdown.png create mode 100644 docs/images/rbac/role-selector.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 20601350..b8656b89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +* **rbac:** introduce Deployer and Node Admin intermediate roles with scoped permissions (Team Pro) + - Deployer role: can deploy, restart, stop, and start stacks but cannot edit compose files, delete stacks, or access system settings + - Node Admin role: full stack and node management but no system settings, user management, or license access + - Scoped permissions: assign roles per stack or per node for fine-grained access control + - Permission matrix engine with `checkPermission()` for consistent backend enforcement + - Frontend `can()` function in AuthContext for consistent UI guards + - New API endpoints: `GET/POST/DELETE /api/users/:id/roles` for managing scoped assignments + - New API endpoint: `GET /api/permissions/me` for fetching effective permissions + - Gated to Team Pro tier — Community and Personal Pro retain binary Admin/Viewer roles + ## [0.17.0](https://github.com/AnsoCode/Sencho/compare/v0.16.0...v0.17.0) (2026-03-29) diff --git a/backend/src/index.ts b/backend/src/index.ts index 35628d9c..97ef9c94 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -18,7 +18,7 @@ import httpProxy from 'http-proxy'; import { createProxyMiddleware } from 'http-proxy-middleware'; import path from 'path'; import { HostTerminalService } from './services/HostTerminalService'; -import { DatabaseService, Node, AuthProvider, ScheduledTask } from './services/DatabaseService'; +import { DatabaseService, Node, AuthProvider, ScheduledTask, UserRole, ResourceType } from './services/DatabaseService'; import { NotificationService } from './services/NotificationService'; import { MonitorService } from './services/MonitorService'; import { ImageUpdateService } from './services/ImageUpdateService'; @@ -204,7 +204,7 @@ app.use(nodeContextMiddleware); declare global { namespace Express { interface Request { - user?: { username: string; role: 'admin' | 'viewer' }; + user?: { username: string; role: UserRole; userId: number }; nodeId: number; apiTokenScope?: 'read-only' | 'deploy-only' | 'full-admin'; } @@ -254,19 +254,20 @@ const authMiddleware = async (req: Request, res: Response, next: NextFunction): } DatabaseService.getInstance().updateApiTokenLastUsed(apiToken.id); const creator = DatabaseService.getInstance().getUserById(apiToken.user_id); - const roleMap: Record = { + const roleMap: Record = { 'read-only': 'viewer', 'deploy-only': 'admin', 'full-admin': 'admin', }; - req.user = { username: creator?.username || `api-token:${apiToken.name}`, role: roleMap[apiToken.scope] || 'viewer' }; + req.user = { username: creator?.username || `api-token:${apiToken.name}`, role: roleMap[apiToken.scope] || 'viewer', userId: apiToken.user_id }; req.apiTokenScope = apiToken.scope as 'read-only' | 'deploy-only' | 'full-admin'; next(); return; } // Accept both user sessions and node proxy tokens. Default role to 'admin' for backward compat with pre-RBAC tokens. - req.user = { username: decoded.username || 'node-proxy', role: (decoded.role as 'admin' | 'viewer') || 'admin' }; + const dbUser = decoded.username ? DatabaseService.getInstance().getUserByUsername(decoded.username) : undefined; + req.user = { username: decoded.username || 'node-proxy', role: (decoded.role as UserRole) || 'admin', userId: dbUser?.id ?? 0 }; next(); } catch (err) { console.error('[Auth] Token validation failed:', (err as Error).message); @@ -806,6 +807,80 @@ const requireAdmin = (req: Request, res: Response): boolean => { return true; }; +// --- Scoped RBAC Permission Engine (Team Pro) --- + +type PermissionAction = + | 'stack:read' | 'stack:edit' | 'stack:deploy' | 'stack:create' | 'stack:delete' + | 'node:read' | 'node:manage' + | 'system:settings' | 'system:users' | 'system:license' | 'system:webhooks' + | 'system:tokens' | 'system:console' | 'system:audit' | 'system:registries'; + +const ROLE_PERMISSIONS: Record = { + admin: [ + 'stack:read', 'stack:edit', 'stack:deploy', 'stack:create', 'stack:delete', + 'node:read', 'node:manage', + 'system:settings', 'system:users', 'system:license', 'system:webhooks', + 'system:tokens', 'system:console', 'system:audit', 'system:registries', + ], + 'node-admin': [ + 'stack:read', 'stack:edit', 'stack:deploy', 'stack:create', 'stack:delete', + 'node:read', 'node:manage', + ], + deployer: [ + 'stack:read', 'stack:deploy', + ], + viewer: [ + 'stack:read', 'node:read', + ], +}; + +/** + * Core permission resolver. Checks if the current user can perform `action` on an optional resource. + * 1. Admin → always true (backward compat) + * 2. Check global role permissions + * 3. If resource specified AND Team Pro → check scoped role_assignments + */ +function checkPermission( + req: Request, + action: PermissionAction, + resourceType?: ResourceType, + resourceId?: string, +): boolean { + if (!req.user) return false; + + const globalRole = req.user.role; + + // Admins always have full access + if (globalRole === 'admin') return true; + + // Check if the user's global role grants this action + if (ROLE_PERMISSIONS[globalRole]?.includes(action)) return true; + + // Scoped assignments only apply when a resource is specified and license is Team Pro + if (!resourceType || !resourceId) return false; + if (LicenseService.getInstance().getVariant() !== 'team') return false; + + const assignments = DatabaseService.getInstance().getRoleAssignments(req.user.userId, resourceType, resourceId); + for (const assignment of assignments) { + if (ROLE_PERMISSIONS[assignment.role]?.includes(action)) return true; + } + + return false; +} + +/** Generic permission guard — sends 403 if denied. */ +function requirePermission( + req: Request, + res: Response, + action: PermissionAction, + resourceType?: ResourceType, + resourceId?: string, +): boolean { + if (checkPermission(req, action, resourceType, resourceId)) return true; + res.status(403).json({ error: 'Permission denied.', code: 'PERMISSION_DENIED' }); + return false; +} + // Scope enforcement for API tokens - restricts which endpoints a token can reach. const DEPLOY_ALLOWED_PATTERNS: RegExp[] = [ /^\/api\/stacks\/[^/]+\/deploy$/, @@ -1690,10 +1765,12 @@ app.post('/api/users', authMiddleware, async (req: Request, res: Response): Prom res.status(400).json({ error: 'Password must be at least 6 characters' }); return; } - if (role !== 'admin' && role !== 'viewer') { - res.status(400).json({ error: 'Role must be "admin" or "viewer"' }); + const validRoles: UserRole[] = ['admin', 'viewer', 'deployer', 'node-admin']; + if (!validRoles.includes(role)) { + res.status(400).json({ error: 'Role must be "admin", "viewer", "deployer", or "node-admin"' }); return; } + if ((role === 'deployer' || role === 'node-admin') && !requireTeamPro(req, res)) return; const db = DatabaseService.getInstance(); const existing = db.getUserByUsername(username); @@ -1708,7 +1785,7 @@ app.post('/api/users', authMiddleware, async (req: Request, res: Response): Prom res.status(403).json({ error: `Your license allows a maximum of ${seatLimits.maxAdmins} admin account${seatLimits.maxAdmins === 1 ? '' : 's'}. Upgrade to Team Pro for unlimited accounts.` }); return; } - if (role === 'viewer' && seatLimits.maxViewers !== null && db.getViewerCount() >= seatLimits.maxViewers) { + if (role !== 'admin' && seatLimits.maxViewers !== null && db.getNonAdminCount() >= seatLimits.maxViewers) { res.status(403).json({ error: `Your license allows a maximum of ${seatLimits.maxViewers} viewer account${seatLimits.maxViewers === 1 ? '' : 's'}. Upgrade to Team Pro for unlimited accounts.` }); return; } @@ -1755,17 +1832,19 @@ app.put('/api/users/:id', authMiddleware, async (req: Request, res: Response): P } if (role !== undefined) { - if (role !== 'admin' && role !== 'viewer') { - res.status(400).json({ error: 'Role must be "admin" or "viewer"' }); + const validRoles: UserRole[] = ['admin', 'viewer', 'deployer', 'node-admin']; + if (!validRoles.includes(role)) { + res.status(400).json({ error: 'Role must be "admin", "viewer", "deployer", or "node-admin"' }); return; } + if ((role === 'deployer' || role === 'node-admin') && !requireTeamPro(req, res)) return; // Prevent demoting yourself if (user.username === req.user!.username && role !== user.role) { res.status(400).json({ error: 'Cannot change your own role' }); return; } // Prevent removing the last admin - if (user.role === 'admin' && role === 'viewer' && db.getAdminCount() <= 1) { + if (user.role === 'admin' && role !== 'admin' && db.getAdminCount() <= 1) { res.status(400).json({ error: 'Cannot demote the only admin user' }); return; } @@ -1823,6 +1902,137 @@ app.delete('/api/users/:id', authMiddleware, async (req: Request, res: Response) } }); +// --- Scoped Role Assignments (Team Pro) --- + +app.get('/api/users/:id/roles', authMiddleware, (req: Request, res: Response): void => { + if (req.apiTokenScope) { + res.status(403).json({ error: 'API tokens cannot access user management.', code: 'SCOPE_DENIED' }); + return; + } + if (!requireAdmin(req, res)) return; + if (!requireTeamPro(req, res)) return; + try { + const userId = parseInt(req.params.id as string, 10); + const db = DatabaseService.getInstance(); + if (!db.getUser(userId)) { + res.status(404).json({ error: 'User not found' }); + return; + } + const assignments = db.getAllRoleAssignments(userId); + res.json(assignments); + } catch (error) { + console.error('[Roles] List error:', error); + res.status(500).json({ error: 'Failed to fetch role assignments' }); + } +}); + +app.post('/api/users/:id/roles', authMiddleware, (req: Request, res: Response): void => { + if (req.apiTokenScope) { + res.status(403).json({ error: 'API tokens cannot access user management.', code: 'SCOPE_DENIED' }); + return; + } + if (!requireAdmin(req, res)) return; + if (!requireTeamPro(req, res)) return; + try { + const userId = parseInt(req.params.id as string, 10); + const { role, resource_type, resource_id } = req.body; + + const validRoles: UserRole[] = ['admin', 'viewer', 'deployer', 'node-admin']; + if (!validRoles.includes(role)) { + res.status(400).json({ error: 'Invalid role' }); + return; + } + const validResourceTypes: ResourceType[] = ['stack', 'node']; + if (!validResourceTypes.includes(resource_type)) { + res.status(400).json({ error: 'Invalid resource type' }); + return; + } + if (!resource_id || typeof resource_id !== 'string') { + res.status(400).json({ error: 'resource_id is required' }); + return; + } + + const db = DatabaseService.getInstance(); + if (!db.getUser(userId)) { + res.status(404).json({ error: 'User not found' }); + return; + } + + try { + const id = db.addRoleAssignment({ user_id: userId, role, resource_type, resource_id }); + res.status(201).json({ id, user_id: userId, role, resource_type, resource_id }); + } catch (err: unknown) { + if ((err as Error).message?.includes('UNIQUE constraint')) { + res.status(409).json({ error: 'This role assignment already exists' }); + return; + } + throw err; + } + } catch (error) { + console.error('[Roles] Create error:', error); + res.status(500).json({ error: 'Failed to add role assignment' }); + } +}); + +app.delete('/api/users/:id/roles/:assignId', authMiddleware, (req: Request, res: Response): void => { + if (req.apiTokenScope) { + res.status(403).json({ error: 'API tokens cannot access user management.', code: 'SCOPE_DENIED' }); + return; + } + if (!requireAdmin(req, res)) return; + if (!requireTeamPro(req, res)) return; + try { + const userId = parseInt(req.params.id as string, 10); + const assignId = parseInt(req.params.assignId as string, 10); + const db = DatabaseService.getInstance(); + + const assignment = db.getRoleAssignmentById(assignId); + if (!assignment || assignment.user_id !== userId) { + res.status(404).json({ error: 'Role assignment not found' }); + return; + } + + db.deleteRoleAssignment(assignId); + res.json({ success: true }); + } catch (error) { + console.error('[Roles] Delete error:', error); + res.status(500).json({ error: 'Failed to delete role assignment' }); + } +}); + +// Return the current user's effective permissions (any authenticated user) +app.get('/api/permissions/me', authMiddleware, (req: Request, res: Response): void => { + try { + if (!req.user) { + res.status(401).json({ error: 'Not authenticated' }); + return; + } + + const db = DatabaseService.getInstance(); + const globalRole = req.user.role; + const globalPermissions = ROLE_PERMISSIONS[globalRole] || []; + const assignments = db.getAllRoleAssignments(req.user.userId); + + const scopedPermissions: Record = {}; + for (const a of assignments) { + const key = `${a.resource_type}:${a.resource_id}`; + const perms = ROLE_PERMISSIONS[a.role] || []; + const existing = scopedPermissions[key] || []; + scopedPermissions[key] = [...new Set([...existing, ...perms])]; + } + + res.json({ + globalRole, + globalPermissions, + scopedPermissions, + isTeamPro: LicenseService.getInstance().getVariant() === 'team', + }); + } catch (error) { + console.error('[Permissions] Error:', error); + res.status(500).json({ error: 'Failed to fetch permissions' }); + } +}); + // Remote Node HTTP Proxy - single global instance. // Previously, createProxyMiddleware was called inside the request handler on every API // call, spawning a new proxy instance (and http-proxy server) each time. This caused: @@ -2231,9 +2441,9 @@ app.get('/api/stacks/:stackName', async (req: Request, res: Response) => { }); app.put('/api/stacks/:stackName', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:edit', 'stack', stackName)) return; try { - const stackName = req.params.stackName as string; if (stackName.includes('..') || stackName.includes('/') || stackName.includes('\\')) { return res.status(400).json({ error: 'Invalid stack name' }); } @@ -2377,9 +2587,9 @@ app.get('/api/stacks/:stackName/env', async (req: Request, res: Response) => { }); app.put('/api/stacks/:stackName/env', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:edit', 'stack', stackName)) return; try { - const stackName = req.params.stackName as string; if (stackName.includes('..') || stackName.includes('/') || stackName.includes('\\')) { return res.status(400).json({ error: 'Invalid stack name' }); } @@ -2411,7 +2621,7 @@ app.put('/api/stacks/:stackName/env', async (req: Request, res: Response) => { }); app.post('/api/stacks', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + if (!requirePermission(req, res, 'stack:create')) return; try { const { stackName } = req.body; if (!stackName || typeof stackName !== 'string') { @@ -2432,8 +2642,8 @@ app.post('/api/stacks', async (req: Request, res: Response) => { }); app.delete('/api/stacks/:name', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; const stackName = req.params.name as string; + if (!requirePermission(req, res, 'stack:delete', 'stack', stackName)) return; try { // Stage 1: Tell Docker to clean up ghost networks/containers try { @@ -2511,9 +2721,9 @@ app.post('/api/containers/:id/restart', async (req: Request, res: Response) => { // End of legacy container routes app.post('/api/stacks/:stackName/deploy', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:deploy', 'stack', stackName)) return; try { - const stackName = req.params.stackName as string; const atomic = LicenseService.getInstance().getTier() === 'pro'; await ComposeService.getInstance(req.nodeId).deployStack(stackName, terminalWs || undefined, atomic); res.json({ message: 'Deployed successfully' }); @@ -2525,9 +2735,9 @@ app.post('/api/stacks/:stackName/deploy', async (req: Request, res: Response) => }); app.post('/api/stacks/:stackName/down', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:deploy', 'stack', stackName)) return; try { - const stackName = req.params.stackName as string; await ComposeService.getInstance(req.nodeId).runCommand(stackName, 'down', terminalWs || undefined); res.json({ status: 'Command started' }); } catch (error) { @@ -2536,9 +2746,9 @@ app.post('/api/stacks/:stackName/down', async (req: Request, res: Response) => { }); app.post('/api/stacks/:stackName/restart', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:deploy', 'stack', stackName)) return; try { - const stackName = req.params.stackName as string; const dockerController = DockerController.getInstance(req.nodeId); const containers = await dockerController.getContainersByStack(stackName); @@ -2555,9 +2765,9 @@ app.post('/api/stacks/:stackName/restart', async (req: Request, res: Response) = }); app.post('/api/stacks/:stackName/stop', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:deploy', 'stack', stackName)) return; try { - const stackName = req.params.stackName as string; const dockerController = DockerController.getInstance(req.nodeId); const containers = await dockerController.getContainersByStack(stackName); @@ -2574,9 +2784,9 @@ app.post('/api/stacks/:stackName/stop', async (req: Request, res: Response) => { }); app.post('/api/stacks/:stackName/start', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:deploy', 'stack', stackName)) return; try { - const stackName = req.params.stackName as string; const dockerController = DockerController.getInstance(req.nodeId); const containers = await dockerController.getContainersByStack(stackName); @@ -2594,9 +2804,9 @@ app.post('/api/stacks/:stackName/start', async (req: Request, res: Response) => // Update stack: pull images and recreate containers app.post('/api/stacks/:stackName/update', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:deploy', 'stack', stackName)) return; try { - const stackName = req.params.stackName as string; const atomic = LicenseService.getInstance().getTier() === 'pro'; await ComposeService.getInstance(req.nodeId).updateStack(stackName, terminalWs || undefined, atomic); res.json({ status: 'Update completed' }); @@ -2608,10 +2818,10 @@ app.post('/api/stacks/:stackName/update', async (req: Request, res: Response) => // Manual rollback endpoint (Pro + Admin) app.post('/api/stacks/:stackName/rollback', async (req: Request, res: Response) => { - if (!requireAdmin(req, res)) return; + const stackName = req.params.stackName as string; + if (!requirePermission(req, res, 'stack:deploy', 'stack', stackName)) return; if (!requirePro(req, res)) return; try { - const stackName = req.params.stackName as string; const fsSvc = FileSystemService.getInstance(req.nodeId); const backupInfo = await fsSvc.getBackupInfo(stackName); if (!backupInfo.exists) { @@ -4098,7 +4308,7 @@ app.post('/api/nodes', async (req: Request, res: Response) => { res.status(403).json({ error: 'API tokens cannot manage nodes.', code: 'SCOPE_DENIED' }); return; } - if (!requireAdmin(req, res)) return; + if (!requirePermission(req, res, 'node:manage')) return; try { const { name, type, compose_dir, is_default, api_url, api_token } = req.body; @@ -4143,9 +4353,10 @@ app.put('/api/nodes/:id', async (req: Request, res: Response) => { res.status(403).json({ error: 'API tokens cannot manage nodes.', code: 'SCOPE_DENIED' }); return; } - if (!requireAdmin(req, res)) return; + const nodeId = req.params.id as string; + if (!requirePermission(req, res, 'node:manage', 'node', nodeId)) return; try { - const id = parseInt(req.params.id as string); + const id = parseInt(nodeId); const updates = req.body; if (updates.api_url !== undefined && updates.api_url !== '') { @@ -4173,9 +4384,10 @@ app.delete('/api/nodes/:id', async (req: Request, res: Response) => { res.status(403).json({ error: 'API tokens cannot manage nodes.', code: 'SCOPE_DENIED' }); return; } - if (!requireAdmin(req, res)) return; + const nodeIdParam = req.params.id as string; + if (!requirePermission(req, res, 'node:manage', 'node', nodeIdParam)) return; try { - const id = parseInt(req.params.id as string); + const id = parseInt(nodeIdParam); DatabaseService.getInstance().deleteNode(id); NodeRegistry.getInstance().evictConnection(id); res.json({ success: true }); diff --git a/backend/src/services/DatabaseService.ts b/backend/src/services/DatabaseService.ts index 036fcbf9..91806ce8 100644 --- a/backend/src/services/DatabaseService.ts +++ b/backend/src/services/DatabaseService.ts @@ -62,11 +62,14 @@ export interface WebhookExecution { export type AuthProvider = 'local' | 'ldap' | 'oidc_google' | 'oidc_github' | 'oidc_okta'; +export type UserRole = 'admin' | 'viewer' | 'deployer' | 'node-admin'; +export type ResourceType = 'stack' | 'node'; + export interface User { id: number; username: string; password_hash: string; - role: 'admin' | 'viewer'; + role: UserRole; auth_provider: AuthProvider; provider_id: string | null; email: string | null; @@ -74,6 +77,15 @@ export interface User { updated_at: number; } +export interface RoleAssignment { + id: number; + user_id: number; + role: UserRole; + resource_type: ResourceType; + resource_id: string; + created_at: number; +} + export interface SSOConfig { id: number; provider: string; @@ -201,6 +213,7 @@ export class DatabaseService { this.migrateEncryptNodeTokens(); this.migrateSSOColumns(); this.migrateRegistries(); + this.migrateRoleAssignments(); } public static getInstance(): DatabaseService { @@ -529,6 +542,25 @@ export class DatabaseService { `); } + private migrateRoleAssignments(): void { + this.db.exec(` + CREATE TABLE IF NOT EXISTS role_assignments ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL, + role TEXT NOT NULL, + resource_type TEXT NOT NULL, + resource_id TEXT NOT NULL, + created_at INTEGER NOT NULL, + FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE + ); + CREATE INDEX IF NOT EXISTS idx_role_assignments_user ON role_assignments(user_id); + CREATE INDEX IF NOT EXISTS idx_role_assignments_resource ON role_assignments(resource_type, resource_id); + `); + try { + this.db.exec('CREATE UNIQUE INDEX IF NOT EXISTS idx_role_assignments_unique ON role_assignments(user_id, role, resource_type, resource_id)'); + } catch { /* already exists */ } + } + // --- Agents --- public getAgents(): Agent[] { @@ -902,7 +934,7 @@ export class DatabaseService { return this.db.prepare('SELECT * FROM users WHERE auth_provider = ? AND provider_id = ?').get(authProvider, providerId) as User | undefined; } - public addUser(user: { username: string; password_hash: string; role: 'admin' | 'viewer'; auth_provider?: AuthProvider; provider_id?: string | null; email?: string | null }): number { + public addUser(user: { username: string; password_hash: string; role: UserRole; auth_provider?: AuthProvider; provider_id?: string | null; email?: string | null }): number { const now = Date.now(); const result = this.db.prepare( 'INSERT INTO users (username, password_hash, role, auth_provider, provider_id, email, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' @@ -943,6 +975,44 @@ export class DatabaseService { return (this.db.prepare("SELECT COUNT(*) as count FROM users WHERE role = 'viewer'").get() as { count: number })?.count || 0; } + public getNonAdminCount(): number { + return (this.db.prepare("SELECT COUNT(*) as count FROM users WHERE role != 'admin'").get() as { count: number })?.count || 0; + } + + // --- Role Assignments --- + + public getRoleAssignments(userId: number, resourceType: ResourceType, resourceId: string): RoleAssignment[] { + return this.db.prepare( + 'SELECT * FROM role_assignments WHERE user_id = ? AND resource_type = ? AND resource_id = ?' + ).all(userId, resourceType, resourceId) as RoleAssignment[]; + } + + public getAllRoleAssignments(userId: number): RoleAssignment[] { + return this.db.prepare( + 'SELECT * FROM role_assignments WHERE user_id = ? ORDER BY resource_type, resource_id' + ).all(userId) as RoleAssignment[]; + } + + public addRoleAssignment(assignment: { user_id: number; role: UserRole; resource_type: ResourceType; resource_id: string }): number { + const now = Date.now(); + const result = this.db.prepare( + 'INSERT INTO role_assignments (user_id, role, resource_type, resource_id, created_at) VALUES (?, ?, ?, ?, ?)' + ).run(assignment.user_id, assignment.role, assignment.resource_type, assignment.resource_id, now); + return result.lastInsertRowid as number; + } + + public getRoleAssignmentById(id: number): RoleAssignment | undefined { + return this.db.prepare('SELECT * FROM role_assignments WHERE id = ?').get(id) as RoleAssignment | undefined; + } + + public deleteRoleAssignment(id: number): void { + this.db.prepare('DELETE FROM role_assignments WHERE id = ?').run(id); + } + + public deleteRoleAssignmentsByUser(userId: number): void { + this.db.prepare('DELETE FROM role_assignments WHERE user_id = ?').run(userId); + } + // --- SSO Config --- public getSSOConfigs(): SSOConfig[] { diff --git a/docs/features/rbac.mdx b/docs/features/rbac.mdx index 44339fdc..3ab8ce6d 100644 --- a/docs/features/rbac.mdx +++ b/docs/features/rbac.mdx @@ -1,70 +1,101 @@ --- title: RBAC & User Management -description: Role-based access control for Sencho Pro - create admin and viewer accounts to control who can modify your stacks. +description: Role-based access control for Sencho - manage admin, viewer, deployer, and node admin accounts with scoped permissions. --- - RBAC requires a Sencho Pro license. Community Edition supports a single admin account only. + Multi-user support requires a Sencho Pro license. Community Edition supports a single admin account only. Intermediate roles (Deployer, Node Admin) and scoped permissions require **Team Pro**. -Sencho Pro introduces role-based access control with two distinct roles: **Admin** and **Viewer**. This lets you give team members read-only access to your infrastructure without risking accidental changes. +Sencho supports role-based access control with four distinct roles. The classic **Admin** and **Viewer** roles are available on all Pro tiers, while **Deployer** and **Node Admin** are exclusive to Team Pro and support scoped permissions per stack or node. ## Roles -| Role | Description | -|------|-------------| -| **Admin** | Full access to all features - deploy, edit, manage users, configure nodes, and more | -| **Viewer** | Read-only access to dashboards, logs, stats, and file contents | +| Role | Description | Tier | +|------|-------------|------| +| **Admin** | Full access to all features — deploy, edit, manage users, configure nodes, and more | Pro | +| **Viewer** | Read-only access to dashboards, logs, stats, and file contents | Pro | +| **Deployer** | Can deploy, restart, stop, and start stacks — but cannot edit compose files, delete stacks, or access system settings | Team Pro | +| **Node Admin** | Full stack and node management within their scope — cannot access system settings, users, or license management | Team Pro | -### What viewers can see +### Permission matrix -- Dashboard and home metrics -- Stacks list and stack detail view -- Compose and `.env` file contents (read-only) -- Per-container stats and logs -- Fleet view -- Resources hub (images, volumes, networks - read-only) -- Global logs -- Notifications +| Action | Admin | Node Admin | Deployer | Viewer | +|--------|-------|------------|----------|--------| +| View stacks, logs, stats | ✅ | ✅ | ✅ | ✅ | +| Deploy / restart / stop / start stacks | ✅ | ✅ | ✅ | ❌ | +| Edit compose and `.env` files | ✅ | ✅ | ❌ | ❌ | +| Create and delete stacks | ✅ | ✅ | ❌ | ❌ | +| View nodes | ✅ | ✅ | ✅ | ✅ | +| Add / edit / delete nodes | ✅ | ✅ | ❌ | ❌ | +| System settings | ✅ | ❌ | ❌ | ❌ | +| User management | ✅ | ❌ | ❌ | ❌ | +| License management | ✅ | ❌ | ❌ | ❌ | +| Webhooks | ✅ | ❌ | ❌ | ❌ | +| API tokens | ✅ | ❌ | ❌ | ❌ | +| Host console | ✅ | ❌ | ❌ | ❌ | +| Audit log | ✅ | ❌ | ❌ | ❌ | -### What viewers cannot do +## Scoped permissions -- Edit compose or environment files -- Deploy, restart, stop, or start stacks -- Create or delete stacks -- Manage users, nodes, webhooks, or alerts -- Access the host console -- Prune resources -- Change settings + + Scoped permissions require a **Team Pro** license. + + +Roles can be scoped to specific stacks or nodes. This means you can grant a user the **Deployer** role globally, but also give them **Node Admin** access on a specific node — or limit a viewer to deploy access on only certain stacks. + +Scoped permissions **add to** the user's global role. They never reduce it. A user with a global Viewer role plus a scoped Deployer assignment on "my-app" stack can deploy "my-app" but has read-only access to everything else. + +### Example scenarios + +- A **Viewer** with a scoped **Deployer** assignment on the `frontend` stack can deploy, restart, and stop only that stack. +- A **Deployer** with a scoped **Node Admin** assignment on node "staging-server" can manage stacks and nodes on that server, plus deploy globally. +- A **Node Admin** without any scoped assignments can manage all stacks and nodes but has no access to system settings. ## Managing users - Users management panel showing user list with roles + User Management with role-based access control Admins can manage accounts in **Settings → Users**. From there you can: -- **Create** a new user with a username, password, and role (Admin or Viewer) +- **Create** a new user with a username, password, and role - **Edit** an existing user's password or role - **Delete** a user account +When creating or editing a user on Team Pro, you'll see all four role options in the role selector. On Personal Pro, only Admin and Viewer are available. + + + Role selector showing all four roles on Team Pro + + +## Managing scoped permissions + +When editing a user on Team Pro, a **Scoped Permissions** section appears below the user form. Here you can: + +1. **View** the user's current scoped assignments +2. **Add** a new scope by selecting a role, resource type (stack or node), and specific resource +3. **Remove** an existing scope + +Each scoped assignment grants the specified role's permissions on the specified resource only. + ## SSO auto-provisioning With a Team Pro license, users can also be created automatically when they log in via SSO (LDAP, Google, GitHub, or Okta). SSO users appear in the Users list alongside local accounts. They are assigned a role based on identity provider group membership or claim mapping. -SSO users cannot log in with a password - they must always authenticate through their identity provider. +SSO users cannot log in with a password — they must always authenticate through their identity provider. After SSO provisioning, an admin can add scoped permissions to SSO users just like local accounts. To set up identity provider authentication, see [SSO Authentication →](/features/sso). ## Migration from single-admin setup -When you upgrade to Sencho Pro, your existing single-admin credentials are automatically migrated to the new users table. No manual action is required - your login continues to work as before, and your account is assigned the Admin role. +When you upgrade to Sencho Pro, your existing single-admin credentials are automatically migrated to the new users table. No manual action is required — your login continues to work as before, and your account is assigned the Admin role. ## License tiers -| Tier | Admin accounts | Viewer accounts | -|------|---------------|-----------------| -| **Community** | 1 | 0 | -| **Personal Pro** | 1 | 3 | -| **Team Pro** | Unlimited | Unlimited | +| Tier | Admin accounts | Non-admin accounts | Intermediate roles | Scoped permissions | +|------|---------------|-------------------|-------------------|-------------------| +| **Community** | 1 | 0 | ❌ | ❌ | +| **Personal Pro** | 1 | 3 | ❌ | ❌ | +| **Team Pro** | Unlimited | Unlimited | ✅ | ✅ | diff --git a/docs/images/rbac/role-selector-dropdown.png b/docs/images/rbac/role-selector-dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5aa36ef505cf5201f49218b82ff1b05027b00f GIT binary patch literal 82645 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 U9%UVDL67m3*G|v!Ev(eP0NXU}2LJ#7 literal 0 HcmV?d00001 diff --git a/docs/images/rbac/role-selector.png b/docs/images/rbac/role-selector.png new file mode 100644 index 0000000000000000000000000000000000000000..13170feae3462fd2c7104f78552cefc39f99a3df GIT binary patch literal 83483 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 BIwk-B literal 0 HcmV?d00001 diff --git a/frontend/src/components/AppStoreView.tsx b/frontend/src/components/AppStoreView.tsx index 91e5da19..d23fde51 100644 --- a/frontend/src/components/AppStoreView.tsx +++ b/frontend/src/components/AppStoreView.tsx @@ -45,7 +45,7 @@ interface AppStoreViewProps { } export function AppStoreView({ onDeploySuccess }: AppStoreViewProps) { - const { isAdmin } = useAuth(); + const { can } = useAuth(); const { activeNode } = useNodes(); const [templates, setTemplates] = useState([]); const [searchQuery, setSearchQuery] = useState(''); @@ -473,10 +473,10 @@ export function AppStoreView({ onDeploySuccess }: AppStoreViewProps) {

- setFormRole(v as UserRole)}> Admin Viewer + {isPro && license?.variant === 'team' && ( + <> + Deployer + Node Admin + + )}
@@ -570,6 +662,83 @@ function UsersSection() { {saving ? <>Saving... : (editingUser ? 'Update User' : 'Create User')} + + {/* Scoped Permissions (Team Pro, editing only) */} + {editingUser && isPro && license?.variant === 'team' && ( +
+

Scoped Permissions

+

+ Grant additional permissions on specific stacks or nodes. These supplement the user's global role. +

+ + {roleAssignments.length > 0 && ( +
+ {roleAssignments.map((a) => ( +
+ + {a.role} + on {a.resource_type}: {a.resource_id} + + +
+ ))} +
+ )} + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ )} )} @@ -602,7 +771,7 @@ function UsersSection() { {isSelf && (you)} - + {u.role} diff --git a/frontend/src/context/AuthContext.tsx b/frontend/src/context/AuthContext.tsx index 9b9ab66e..eb2c0229 100644 --- a/frontend/src/context/AuthContext.tsx +++ b/frontend/src/context/AuthContext.tsx @@ -1,10 +1,25 @@ -import { createContext, useContext, useState, useEffect, type ReactNode } from 'react'; +import { createContext, useContext, useState, useEffect, useCallback, type ReactNode } from 'react'; type AppStatus = 'loading' | 'needsSetup' | 'notAuthenticated' | 'authenticated'; +export type UserRole = 'admin' | 'viewer' | 'deployer' | 'node-admin'; + +export type PermissionAction = + | 'stack:read' | 'stack:edit' | 'stack:deploy' | 'stack:create' | 'stack:delete' + | 'node:read' | 'node:manage' + | 'system:settings' | 'system:users' | 'system:license' | 'system:webhooks' + | 'system:tokens' | 'system:console' | 'system:audit' | 'system:registries'; + interface UserInfo { username: string; - role: 'admin' | 'viewer'; + role: UserRole; +} + +interface PermissionsData { + globalRole: UserRole; + globalPermissions: PermissionAction[]; + scopedPermissions: Record; + isTeamPro: boolean; } interface AuthContextType { @@ -13,6 +28,8 @@ interface AuthContextType { needsSetup: boolean; user: UserInfo | null; isAdmin: boolean; + permissions: PermissionsData | null; + can: (action: PermissionAction, resourceType?: string, resourceId?: string) => boolean; login: (username: string, password: string) => Promise<{ success: boolean; error?: string }>; ssoLdapLogin: (username: string, password: string) => Promise<{ success: boolean; error?: string }>; logout: () => Promise; @@ -25,6 +42,7 @@ const AuthContext = createContext(undefined); export function AuthProvider({ children }: { children: ReactNode }) { const [appStatus, setAppStatus] = useState('loading'); const [user, setUser] = useState(null); + const [permissions, setPermissions] = useState(null); const checkAuth = async () => { try { @@ -37,6 +55,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { if (statusData.needsSetup) { setAppStatus('needsSetup'); setUser(null); + setPermissions(null); return; } @@ -49,12 +68,24 @@ export function AuthProvider({ children }: { children: ReactNode }) { const data = await authResponse.json(); setUser(data.user ?? null); setAppStatus('authenticated'); + + // Fetch effective permissions + try { + const permsRes = await fetch('/api/permissions/me', { credentials: 'include' }); + if (permsRes.ok) { + setPermissions(await permsRes.json()); + } + } catch { + // Permissions fetch is non-critical — fallback to global role only + } } else { setUser(null); + setPermissions(null); setAppStatus('notAuthenticated'); } } catch { setUser(null); + setPermissions(null); setAppStatus('notAuthenticated'); } }; @@ -66,6 +97,24 @@ export function AuthProvider({ children }: { children: ReactNode }) { return () => window.removeEventListener('sencho-unauthorized', handleUnauthorized); }, []); + const can = useCallback((action: PermissionAction, resourceType?: string, resourceId?: string): boolean => { + if (!permissions) return false; + + // Admins always have full access + if (permissions.globalRole === 'admin') return true; + + // Check global role permissions + if (permissions.globalPermissions.includes(action)) return true; + + // Check scoped permissions + if (resourceType && resourceId) { + const key = `${resourceType}:${resourceId}`; + return permissions.scopedPermissions[key]?.includes(action) ?? false; + } + + return false; + }, [permissions]); + const login = async (username: string, password: string): Promise<{ success: boolean; error?: string }> => { try { const response = await fetch('/api/auth/login', { @@ -125,6 +174,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { console.error('Logout error:', error); } finally { setUser(null); + setPermissions(null); setAppStatus('notAuthenticated'); } }; @@ -141,6 +191,8 @@ export function AuthProvider({ children }: { children: ReactNode }) { needsSetup: appStatus === 'needsSetup', user, isAdmin: user?.role === 'admin', + permissions, + can, login, ssoLdapLogin, logout,