RBAC & Permissions

15 system roles, 67 granular permissions across 11 categories. Custom roles per society. KV-cached permission lookups. ABAC overlay for context-aware access.

System Roles (by priority)

#RolePriorityDescription
1SUPER_ADMIN1Platform super admin (Societee team)
2SOCIETY_ADMIN2Society president/secretary
3COMMITTEE_MEMBER3Managing committee member
4TREASURER4Financial operations
5SECRETARY5Administrative operations
6ESTATE_MANAGER6Facility/property manager
7ACCOUNTANT7Accounting operations
8SECURITY_SUPERVISOR8Security team lead
9RESIDENT_OWNER9Flat owner
10RESIDENT_TENANT10Flat tenant
11GUARD11Security guard (lightweight access)
12VENDOR12External service vendor
13STAFF13Society employee
14MEMBER14Basic community member
15CUSTOM15Custom role (per-society)

Permission Categories (67 total)

CategoryPermissionsExamples
billing8billing.view, billing.create, billing.approve, billing.delete
accounting8accounting.view, accounting.journal, accounting.gst, accounting.tds
finance6finance.invoices, finance.payments, finance.receipts, finance.ledger
complaints5complaints.view, complaints.create, complaints.assign, complaints.resolve
visitors5visitors.view, visitors.approve, visitors.check_in, visitors.check_out
documents6documents.view, documents.upload, documents.delete, documents.letter_approve
facilities5facilities.view, facilities.book, facilities.cancel, facilities.manage
governance7governance.view, governance.meeting, governance.vote, governance.resolution
security7security.view, security.blacklist, security.gate, security.sos
admin8admin.society, admin.members, admin.roles, admin.features, admin.settings
reports4reports.financial, reports.operational, reports.compliance, reports.export

Database Tables

role_definitions (15 system + custom per-society)
  └── role_permissions (role_id + permission_key + grant/deny)

permission_definitions (67 permissions, 11 categories)

user_role_assignments (user_id + society_id + role_id, with expiry)
  └── KV-cached: key = "rbac:{userId}:{societyId}" → Set of permissions

Usage in Code

// Middleware: require specific permission
app.get('/v1/accounting/chart-of-accounts',
  authMiddleware,
  requirePermission('accounting.view'),
  async (c) => { ... }
);

// In handler: check permission dynamically
const canApprove = c.get('user').permissions.includes('billing.approve');

// Frontend hook
const { hasPermission } = useAuth();
if (hasPermission('reports.export')) {
  // Show export button
}

ABAC Overlay

ABAC (Attribute-Based Access Control) adds context-aware rules on top of RBAC. Evaluates conditions based on: