# RBAC Deployment Guide ## Pre-Deployment Checklist ### 1. Verify Implementation - ✅ All backend files pass syntax check - ✅ Frontend components have no errors - ✅ Translations complete (EN/RO) - ✅ Documentation finalized ### 2. Database Backup ```bash # Create backup before deploying RBAC changes docker exec streamflow-backend npm run backup:create ``` ### 3. Review Configuration ```bash # Ensure JWT_SECRET is set echo $JWT_SECRET # Verify NODE_ENV for production echo $NODE_ENV ``` --- ## Deployment Steps ### Step 1: Stop Application ```bash cd /home/iulian/projects/tv docker-compose down ``` ### Step 2: Pull Latest Changes ```bash git pull origin main # or copy updated files manually ``` ### Step 3: Rebuild Docker Containers ```bash docker-compose build --no-cache ``` ### Step 4: Start Application ```bash docker-compose up -d ``` ### Step 5: Verify Database Initialization ```bash # Check logs for RBAC initialization docker-compose logs backend | grep -i "role" # Expected output: # ✓ Role seeded: admin # ✓ Role seeded: moderator # ✓ Role seeded: user # ✓ Role seeded: viewer # ✓ Permission audit log table created ``` ### Step 6: Verify Routes ```bash # Test RBAC API endpoints curl -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ http://localhost:5000/api/rbac/roles # Should return array of 4 default roles ``` --- ## Post-Deployment Testing ### 1. Login as Admin 1. Navigate to `/login` 2. Login with admin credentials 3. Access `/security/rbac` 4. Verify RBAC Dashboard loads ### 2. Test Role Management **Create Custom Role:** 1. Click "Create Role" button 2. Fill in: - Role Key: `content_editor` - Name: `Content Editor` - Description: `Manages playlists and channels` 3. Select permissions: - `playlists.view`, `playlists.create`, `playlists.edit` - `channels.view`, `channels.edit` 4. Click "Create" 5. Verify role appears in list **Edit Role:** 1. Click edit icon on custom role 2. Add permission: `playlists.delete` 3. Click "Save" 4. Verify permissions updated **Delete Role:** 1. Click delete icon on custom role 2. Confirm deletion 3. Verify role removed ### 3. Test User Role Assignment 1. Go to "User Roles" tab 2. Select a test user 3. Click "Change Role" 4. Assign "moderator" role 5. Verify role assigned 6. Check audit log for `role_assigned` entry ### 4. Test Permission Checking **As Moderator:** 1. Login as moderator user 2. Access `/security/rbac` 3. Should see error: "Insufficient permissions" 4. Access `/stats` - Should work ✅ 5. Access `/settings` - Should only view, not edit **As Regular User:** 1. Login as regular user 2. Access `/security` - Should not show admin features 3. Access own playlists - Should work ✅ 4. Try to access user management - Should fail ❌ **As Viewer:** 1. Login as viewer user 2. Try to create playlist - Should fail ❌ 3. View channels - Should work ✅ 4. View favorites - Should work ✅ ### 5. Test Audit Logging 1. Go to RBAC Dashboard > Audit Log tab 2. Verify all test actions logged: - `role_created` - `role_updated` - `role_deleted` - `role_assigned` 3. Check details show correct user, IP, timestamp ### 6. Test Permission Cache 1. Assign user to "moderator" role 2. Wait 5 minutes (cache TTL) 3. Verify user has new permissions 4. Or force refresh by reassigning role --- ## Verification Tests ### Backend API Tests ```bash # Set your admin token TOKEN="your_admin_jwt_token" # Test 1: List all permissions curl -H "Authorization: Bearer $TOKEN" \ http://localhost:5000/api/rbac/permissions | jq # Test 2: List all roles curl -H "Authorization: Bearer $TOKEN" \ http://localhost:5000/api/rbac/roles | jq # Test 3: Get my permissions curl -H "Authorization: Bearer $TOKEN" \ http://localhost:5000/api/rbac/my-permissions | jq # Test 4: Create custom role curl -X POST -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "role_key": "test_role", "name": "Test Role", "description": "Testing role creation", "permissions": ["playlists.view", "channels.view"] }' \ http://localhost:5000/api/rbac/roles | jq # Test 5: Get audit log curl -H "Authorization: Bearer $TOKEN" \ http://localhost:5000/api/rbac/audit-log | jq # Test 6: Get statistics curl -H "Authorization: Bearer $TOKEN" \ http://localhost:5000/api/rbac/stats | jq ``` ### Frontend Component Tests 1. **RBAC Dashboard Access** - Admin: ✅ Full access - Moderator: ❌ Access denied - User: ❌ Access denied - Viewer: ❌ Access denied 2. **My Permissions Tab** - All roles: ✅ Can view own permissions - Permissions grouped by category - Correct permission counts 3. **Role Management** - Create role: ✅ Works for admin - Edit role: ✅ Works for admin (custom roles only) - Delete role: ✅ Works for admin (custom roles only) - System role protection: ✅ Cannot modify 4. **User Role Assignment** - Assign role: ✅ Works for admin - Self-assignment prevention: ✅ Cannot change own role - Non-existent role: ❌ Error shown --- ## Monitoring & Maintenance ### Daily Checks 1. **Audit Log Review** - Check for suspicious role changes - Monitor permission grant patterns - Review failed permission checks 2. **Role Distribution** - Review `/api/rbac/stats` - Ensure appropriate role distribution - Identify over-privileged accounts 3. **Permission Cache Performance** - Monitor cache hit rate (should be >90%) - Check for cache invalidation patterns ### Weekly Maintenance 1. **Clean Old Audit Logs** (Optional) ```sql DELETE FROM permission_audit_log WHERE created_at < datetime('now', '-90 days'); ``` 2. **Review Custom Roles** - Are all custom roles still needed? - Can any be consolidated? - Remove unused roles 3. **Permission Audit** - Review user permissions - Apply principle of least privilege - Demote over-privileged users ### Monthly Review 1. **Security Assessment** - Review role definitions - Check for permission creep - Validate default role permissions 2. **Performance Tuning** - Analyze cache efficiency - Check database query performance - Review audit log size 3. **Documentation Update** - Update custom role documentation - Record permission changes - Update deployment notes --- ## Troubleshooting ### Issue: RBAC routes not working **Symptoms:** 404 errors on `/api/rbac/*` endpoints **Solution:** 1. Verify route registration in `server.js`: ```javascript app.use('/api/rbac', require('./routes/rbac')); ``` 2. Restart server 3. Check logs for route loading errors ### Issue: Roles not seeded **Symptoms:** Empty roles table, dashboard shows no roles **Solution:** 1. Check database initialization logs: ```bash docker-compose logs backend | grep -i "role seeded" ``` 2. Manually initialize: ```bash docker exec -it streamflow-backend node -e " const { initializeRoles } = require('./middleware/rbac'); initializeRoles(); " ``` 3. Restart application ### Issue: Permission checks failing **Symptoms:** "Insufficient permissions" errors for valid users **Solution:** 1. Clear permission cache: ```javascript // In backend console const { clearAllPermissionCache } = require('./middleware/rbac'); clearAllPermissionCache(); ``` 2. Verify user role: ```sql SELECT id, username, role FROM users WHERE id = ?; ``` 3. Verify role permissions: ```sql SELECT * FROM roles WHERE role_key = 'user'; ``` 4. Check permission spelling (case-sensitive) ### Issue: Cannot delete custom role **Symptoms:** "Cannot delete role that is assigned to users" **Solution:** 1. Find users with that role: ```sql SELECT id, username FROM users WHERE role = 'custom_role_key'; ``` 2. Reassign users to different role 3. Then delete custom role ### Issue: Audit log not recording **Symptoms:** Empty audit log despite changes **Solution:** 1. Verify table exists: ```sql SELECT name FROM sqlite_master WHERE type='table' AND name='permission_audit_log'; ``` 2. Check for INSERT errors in logs 3. Verify `logPermissionAction()` calls in code ### Issue: Frontend dashboard not loading **Symptoms:** Blank page or React errors **Solution:** 1. Check browser console for errors 2. Verify translations loaded: ```javascript console.log(i18n.t('rbac.dashboard')); ``` 3. Check API responses in Network tab 4. Verify authentication token valid --- ## Rollback Plan If RBAC causes issues: ### Quick Rollback (Keep RBAC, Disable Checks) 1. Comment out RBAC middleware in routes: ```javascript // Temporarily comment out // const { requirePermission } = require('../middleware/rbac'); // Keep using requireAdmin router.get('/users', authenticate, requireAdmin, ...); ``` 2. Restart server 3. RBAC data preserved, enforcement disabled ### Full Rollback (Remove RBAC) 1. Restore database backup: ```bash docker exec streamflow-backend npm run backup:restore -- backup-name.zip ``` 2. Revert code changes: ```bash git revert HEAD~5 # Revert last 5 commits ``` 3. Rebuild and restart: ```bash docker-compose down docker-compose build --no-cache docker-compose up -d ``` ### Partial Rollback (Keep Tables, Remove UI) 1. Comment out RBAC Dashboard route in `App.jsx` 2. Remove RBAC link from Security Dashboard 3. Keep backend routes active (for future use) --- ## Performance Benchmarks ### Expected Performance **Permission Check (Cached):** - Response time: <5ms - Database queries: 0 - Cache hit rate: >90% **Permission Check (Uncached):** - Response time: <50ms - Database queries: 1 - Cache miss rate: <10% **Role Assignment:** - Response time: <100ms - Database queries: 3 - Audit log writes: 1 **Audit Log Query:** - Response time: <200ms (100 records) - Database queries: 1 - Pagination supported ### Monitoring Queries ```sql -- Check role distribution SELECT r.name, COUNT(u.id) as user_count FROM roles r LEFT JOIN users u ON r.role_key = u.role GROUP BY r.role_key; -- Recent permission changes SELECT action, COUNT(*) as count FROM permission_audit_log WHERE created_at >= datetime('now', '-7 days') GROUP BY action; -- Most active permission managers SELECT u.username, COUNT(pal.id) as change_count FROM permission_audit_log pal JOIN users u ON pal.user_id = u.id WHERE pal.created_at >= datetime('now', '-30 days') GROUP BY u.id ORDER BY change_count DESC LIMIT 10; ``` --- ## Security Checklist ### Pre-Production - [ ] All default roles reviewed and approved - [ ] System role permissions validated - [ ] Custom roles documented - [ ] Audit logging tested - [ ] Permission cache working correctly - [ ] All tests passing - [ ] Documentation complete ### Production - [ ] JWT_SECRET is strong and unique - [ ] NODE_ENV=production - [ ] HTTPS enabled - [ ] Rate limiting active - [ ] Audit logs monitored - [ ] Backup strategy in place - [ ] Rollback plan tested ### Post-Deployment - [ ] All roles seeded correctly - [ ] Permission checks working - [ ] Audit log recording events - [ ] Dashboard accessible to admin - [ ] Users can view own permissions - [ ] No performance degradation - [ ] Logs show no errors --- ## Success Criteria ✅ **Deployment Successful When:** 1. All 4 default roles visible in dashboard 2. Admin can create/edit/delete custom roles 3. Role assignment works correctly 4. Permission checks enforce access control 5. Audit log records all changes 6. Statistics show accurate data 7. Users can view own permissions 8. No errors in application logs 9. Performance within expected benchmarks 10. All security tests pass --- ## Support Resources - **Documentation:** `/docs/RBAC_IMPLEMENTATION.md` - **API Reference:** See documentation above - **Frontend Guide:** Check RBACDashboard.jsx comments - **Security Guide:** `/docs/SECURITY_IMPLEMENTATION_COMPLETE.md` For issues or questions: 1. Check troubleshooting section 2. Review audit logs for clues 3. Enable debug logging 4. Contact development team --- **Deployment Date:** 2024-12-13 **Version:** 1.0 **Status:** ✅ Production Ready