DeveloperAuthentication Documentation
Access Control & User Management System
Overview
The Access Control & User Management System provides comprehensive role-based permissions and location-based data access for multi-location clinics. This system enables clinic owners to manage staff across multiple locations with granular control over data access and feature permissions.
Key Features
- Hierarchical Role System: Owner > Admin > Doctor/Consultant > Staff
- Location-Based Access: Assign users to specific locations or grant all-location access
- Shared Patient Records: Patients are shared across locations with access control
- Premium Features: Consolidated reporting and revenue sharing for multi-location clinics
- Security: Two-factor authentication, IP restrictions, and audit trails
User Roles & Hierarchy
Role Definitions
1. Owner
- Description: Clinic owner with full system access
- Key Permissions:
- Full access to all locations and data
- Manage the Kulcare subscription — the owner alone holds this by default
(
view_subscription/manage_subscription, #2274) - Manage practice finance: commissions, revenue share, payouts
- View consolidated reports (premium)
- Create/manage all user types
- Configure clinic settings
- Access revenue sharing data (premium)
2. Admin
- Description: Administrative staff with management capabilities
- Key Permissions:
- Manage users (except owners)
- Access patient bills and practice finance for assigned locations. Not the
Kulcare subscription — changing or cancelling the plan is owner-only unless
the tenant grants
view_subscription/manage_subscriptionto the admin role explicitly (#2274) - View location-specific reports
- Configure location settings
- Full patient and appointment access
3. Doctor/Consultant
- Description: Medical practitioners (consultants are non-owner doctors)
- Key Permissions:
- View/manage their own patients
- Create appointments and prescriptions
- View patient financial data (their patients only)
- No access to other doctors' patients
- No user management capabilities
4. Staff
- Description: Non-medical support staff
- Key Permissions:
- Basic patient registration and queue management
- Appointment scheduling
- No financial data access
- No user management
- No prescription access
Cross-Network Roles
- Users can have different roles across different clinic networks
- Role assignments are network-specific
- Single sign-on with network selection
Location-Based Access Control
Access Models
1. Single Location Access
- User assigned to specific location(s)
- Can only view/manage data for assigned locations
- Appointments and queue specific to location
2. All Locations Access
- Available for Owners and designated Admins
- View and manage data across all clinic locations
- Switch between location-specific and consolidated views
Data Visibility Rules
| Data Type | Owner | Admin | Doctor | Staff |
|---|---|---|---|---|
| Patients | All locations | Assigned locations | Own patients only | Assigned locations |
| Appointments | All locations | Assigned locations | Own appointments | Assigned locations |
| Financial | All + Consolidated | Location-specific | Own patients only | None |
| Reports | All + Consolidated | Location-specific | Own practice only | Basic only |
| Settings | All locations | Assigned locations | None | None |
Permission System
Permission Categories
1. Patient Management
patient.view; // View patient records
patient.create; // Register new patients
patient.edit; // Update patient information
patient.delete; // Delete patient records
patient.export; // Export patient data2. Appointment Management
appointment.view; // View appointments
appointment.create; // Create new appointments
appointment.edit; // Modify appointments
appointment.cancel; // Cancel appointments
appointment.reports; // View appointment reports3. Billing & Financial
These dotted names are illustrative and do not exist in the codebase. The real permissions are flat
feature_namestrings onreference.permissions, and billing is three separate families rather than one — see Permission management API for the authoritative list and Billing domain architecture for which family owns what. In short:
- patient bills:
view_bills,add_bills,edit_bills- practice finance:
view_practice_finance,manage_practice_finance- Kulcare subscription:
view_subscription,manage_subscription(owner only)
billing.view; // View billing information
billing.create; // Create bills/invoices
billing.edit; // Modify billing records
billing.reports; // View financial reports
billing.consolidated; // View multi-location financials (premium)4. Reports & Analytics
reports.clinical; // Clinical reports
reports.financial; // Financial reports
reports.operational; // Operational metrics
reports.consolidated; // Multi-location reports (premium)5. Settings & Configuration
settings.clinic; // Clinic configuration
settings.users; // User management
settings.locations; // Location management
settings.billing; // Billing configuration6. Marketing & Campaigns
marketing.campaigns; // Create/manage campaigns
marketing.spend; // View/manage ad spend
marketing.analytics; // Marketing performanceRole-Permission Matrix
| Permission | Owner | Admin | Doctor | Staff |
|---|---|---|---|---|
| patient.* | ✓ | ✓ | ✓ (own) | ✓ (view/create) |
| appointment.* | ✓ | ✓ | ✓ (own) | ✓ |
| billing.* | ✓ | ✓ (location) | ✓ (own patients) | ✗ |
| reports.* | ✓ | ✓ (location) | ✓ (own) | ✓ (basic) |
| settings.* | ✓ | ✓ (limited) | ✗ | ✗ |
| marketing.* | ✓ | ✓ | ✗ | ✗ |
User Management
User Lifecycle
1. Invitation Flow
Owner/Admin initiates invitation
↓
Email sent with invitation link
↓
User creates account with invitation code
↓
User assigned to role and location(s)
↓
User active in system2. User States
- Invited: Invitation sent, awaiting acceptance
- Active: User has accepted and can access system
- Suspended: Temporarily disabled, cannot login
- Deactivated: Permanently disabled, data retained
Invitation API
POST /api/users/invite
{
email: string
role: "owner" | "admin" | "doctor" | "staff"
locations: string[] | "all"
permissions?: string[] // Optional custom permissions
expiresIn?: number // Invitation expiry in days
}User Management Features
- Bulk user import via CSV
- User activity tracking
- Last login timestamps
- Session management
- Force logout capability
Data Access Patterns
Patient Data Access
- Shared across locations: Patients can visit any clinic location
- Access control: Based on user's location assignment and role
- Doctor-specific: Doctors only see patients they've treated
- Referral visibility: Referred patients visible to receiving doctor
Appointment Access
- Location-specific: Appointments tied to specific locations
- Cross-location booking: Available for authorized users
- Doctor schedules: Visible based on location assignment
Financial Data Access
- Location isolation: Financial data separated by location
- Consolidated view: Available to owners (premium feature)
- Doctor commissions: Track revenue sharing (premium)
- Patient-level: Doctors see financial data for their patients only
Security Features
Feature Flags
The following security features are controlled by feature flags:
ENABLE_TWO_FACTOR_AUTH: Two-factor authentication systemENABLE_AUDIT_TRAIL: Audit trail tracking and viewingENABLE_SESSION_MANAGEMENT: Session management and force logoutENABLE_IP_RESTRICTIONS: IP whitelisting/blacklisting (coming soon)
Authentication & Authorization
Two-Factor Authentication (2FA)
- SMS-based OTP
- Authenticator app support
- Backup codes
- Required for: Owners, Admins (configurable)
Session Management
- Real-time Session Tracking: View all active sessions with device, browser, and location information
- Device Detection: Automatic detection of device type, browser, and operating system
- Force Logout: Terminate individual sessions or all sessions except current
- Session Status: Track active/idle sessions with last activity timestamps
- Current Session Identification: Visual indicator for the user's current session
- Session History: Complete login history with IP addresses and user agents
- Concurrent Login Support: Allow multiple devices with tracking
- Session Timeout Configuration: Customizable session expiration
- Activity Monitoring: Track user actions within each session
IP Restrictions
- Whitelist IP ranges by role
- Location-based IP restrictions
- VPN detection and policies
- Geo-blocking capabilities
Audit Trail
Tracked Events
- User login/logout
- Data access (patient records, financial)
- Configuration changes
- User management actions
- Export operations
Audit Log Structure
{
userId: string
action: string
resource: string
resourceId: string
location: string
ipAddress: string
userAgent: string
timestamp: Date
changes?: Record<string, any>
}Premium Features
Consolidated Reporting
- Multi-location dashboards: Overview across all locations
- Comparative analytics: Compare location performance
- Financial consolidation: Combined P&L statements
- Trend analysis: Cross-location trends
Revenue Sharing & Commissions
- Doctor commission tracking: Percentage or fixed fee
- Automated calculations: Based on services rendered
- Payout management: Track pending and paid commissions
- Performance incentives: Bonus calculations
Advanced Access Control
- Custom roles: Create clinic-specific roles
- Granular permissions: Feature-level access control
- Approval workflows: Multi-step approval for sensitive actions
- Temporary access: Time-bound permission grants
Implementation Architecture
Database Schema Updates
Users Table Extension
ALTER TABLE users ADD COLUMN (
phone_verified BOOLEAN DEFAULT FALSE,
two_factor_enabled BOOLEAN DEFAULT FALSE,
two_factor_secret VARCHAR(255),
last_login_at TIMESTAMP,
suspended_at TIMESTAMP,
suspended_reason TEXT,
created_by_user_id UUID REFERENCES users(id),
ip_whitelist JSONB DEFAULT '[]'
);User Location Assignments
CREATE TABLE user_location_assignments (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
location_id UUID REFERENCES locations(id),
assigned_at TIMESTAMP DEFAULT NOW(),
assigned_by UUID REFERENCES users(id),
is_primary BOOLEAN DEFAULT FALSE,
UNIQUE(user_id, location_id)
);Custom Permissions
CREATE TABLE user_custom_permissions (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
permission VARCHAR(100),
granted_by UUID REFERENCES users(id),
granted_at TIMESTAMP DEFAULT NOW(),
expires_at TIMESTAMP,
UNIQUE(user_id, permission)
);API Endpoints
User Management
// User CRUD
GET /api/users // List users with filters
GET /api/users/:id // Get user details
POST /api/users/invite // Send invitation
PUT /api/users/:id // Update user
DELETE /api/users/:id // Deactivate user
// User Status
PUT /api/users/:id/suspend // Suspend user
PUT /api/users/:id/activate // Activate user
POST /api/users/:id/reset-password // Trigger password reset
// Location Assignment
GET /api/users/:id/locations // Get user's locations
PUT /api/users/:id/locations // Update location assignments
// Permissions
GET /api/users/:id/permissions // Get effective permissions
PUT /api/users/:id/permissions // Update custom permissions
// Audit
GET /api/users/:id/activity // User activity log
GET /api/audit-logs // System-wide audit logs
POST /api/audit-logs/export // Export audit logs (JSON/CSV)
// Session Management
GET /api/users/:id/sessions // Get user's active sessions
DELETE /api/users/:id/sessions/:sessionId // Force logout specific session
DELETE /api/users/:id/sessions // Force logout all sessions
GET /api/sessions/settings // Get session configuration
PUT /api/sessions/settings // Update session configuration
GET /api/sessions/:id/activity // Get session activity detailsState Management Extension
interface UserManagementState {
// Users
users: User[];
usersLoading: boolean;
usersError: string | null;
// Current user permissions
permissions: string[];
locationAccess: string[] | "all";
// Actions
fetchUsers: (filters?: UserFilters) => Promise<void>;
inviteUser: (data: InviteUserData) => Promise<void>;
updateUser: (id: string, data: UpdateUserData) => Promise<void>;
suspendUser: (id: string, reason: string) => Promise<void>;
updateLocationAssignments: (
userId: string,
locations: string[]
) => Promise<void>;
}UI Components
User Management (packages/ui-kit/src/components/users/)
UserTable.tsx; // List users with actions
UserInviteModal.tsx; // Invite new user form
UserEditModal.tsx; // Edit user details
UserLocationManagementModal.tsx; // Manage user location assignments
TwoFactorSetupModal.tsx; // Two-factor authentication setup wizard
TwoFactorManagement.tsx; // Manage 2FA settings
AuditTrailViewer.tsx; // System-wide audit trail with filtering and export
SessionManagement.tsx; // Active session management with force logout
PermissionMatrix.tsx; // View/edit permissions (coming soon)
UserActivityLog.tsx; // User activity timeline (coming soon)Access Control (packages/ui-kit/src/components/access/)
PermissionGate.tsx; // Component-level access control
LocationSelector.tsx; // Switch between locations
AccessDenied.tsx; // Unauthorized access pageIntegration Points
Subscription System Integration
- Location limits enforced based on subscription plan
- Premium features (consolidated reports, revenue sharing) gated by plan
- User invitation limits (if applicable)
Existing Auth System
- Extend current User and Clinic interfaces
- Maintain backward compatibility
- Progressive enhancement approach
Mobile App Considerations
- Same permission model applies
- Location-based features in mobile
- Offline capability with sync
Migration Strategy
Phase 1: Core User Management
- Extend user model with new fields
- Implement invitation system
- Basic role-based permissions
Phase 2: Location-Based Access
- Create location assignment system
- Implement data filtering by location
- Location switching UI
Phase 3: Advanced Features (Completed)
- ✅ Two-factor authentication with TOTP and backup codes
- ✅ Audit trail implementation with filtering and export
- ✅ Session management with force logout capabilities
- ⏳ IP restrictions (pending)
Phase 4: Premium Features
- Consolidated reporting
- Revenue sharing system
- Custom roles and permissions
Security Best Practices
- Principle of Least Privilege: Users get minimum required permissions
- Regular Access Reviews: Periodic audit of user permissions
- Secure Defaults: New users start with minimal access
- Audit Everything: Comprehensive logging of sensitive actions
- Data Encryption: Encrypt sensitive data at rest and in transit