18 KiB
Timebank.cc Security Overview
This document provides a comprehensive overview of the authentication and security features implemented in the Timebank.cc application.
Multi-Guard Authentication System
Guard Architecture
The application implements a sophisticated 4-guard authentication system:
- web: Individual user accounts (
App\Models\User) - Base authentication layer - organization: Non-profit organization profiles (
App\Models\Organization) - bank: Timebank operator profiles (
App\Models\Bank) - admin: Administrative profiles (
App\Models\Admin)
Profile Relationship Model
Each User can be associated with multiple elevated profiles through relationships:
// User Model Relationships
$user->organizations() // Many-to-many via organization_user table
$user->banksManaged() // Many-to-many via bank_user table
$user->admins() // Many-to-many via admins_user table
Guard Switching Mechanism
SwitchGuardTrait Implementation
Located in app/Traits/SwitchGuardTrait.php:
function switchGuard($newGuard, $profile) {
// Logout from all other elevated guards
foreach (['admin', 'bank', 'organization'] as $guard) {
if ($guard !== $newGuard) {
Auth::guard($guard)->logout();
}
}
Auth::guard($newGuard)->login($profile);
session(['active_guard' => $newGuard]);
}
Security Features:
- Mutual Exclusion: Only one elevated guard active at a time
- Base Guard Preservation: 'web' guard remains active as foundation
- Session State Management: Active guard tracked in session
Profile Switch Flow
Complete authentication flow for elevated profiles:
- Intent Registration: Target profile stored in session
- Relationship Verification: System validates user association with target profile
- Password Re-Authentication: Separate password verification required for elevated access
- Legacy Password Migration: Automatic Cyclos password conversion if applicable
- Guard Switch: Authentication state transition using SwitchGuardTrait
- Session Update: Active profile context establishment
- Event Broadcasting: Real-time profile switch notification
Direct Login Routes for Non-User Profiles
Secure direct links to elevated profile logins for use in emails and external communications:
Route Structure:
// Organization
GET /organization/{organizationId}/login
Route name: 'organization.direct-login'
// Bank
GET /bank/{bankId}/login
Route name: 'bank.direct-login'
// Admin
GET /admin/{adminId}/login
Route name: 'admin.direct-login'
Layered Authentication Flow:
- Profile Existence Validation: System verifies target profile exists (404 if not found)
- User Authentication Check:
- If user not authenticated on 'web' guard → redirect to user login
- Stores return URL in
session('url.intended')for post-login redirect - Custom
LoginResponseallows redirect back to profile switch after user auth
- Relationship Authorization: Verifies user owns/manages target profile (403 if denied)
- Profile Switch:
- Organizations: Direct guard switch without password (passwordless)
- Banks/Admins: Sets session variables for profile password page
- Password Re-Authentication (Banks/Admins only): Redirects to profile-specific password entry
- Guard Switch & Redirect: Switches guard and redirects to intended URL or main page
Security Features:
- Multi-Layer Verification: Requires both user authentication AND profile relationship
- Differentiated Authentication:
- Organizations: Passwordless switch (matches in-app profile switching behavior)
- Banks: Separate password required for elevated financial privileges
- Admins: Separate password required for administrative access
- Session Isolation: Each profile type uses dedicated session keys
- Intended URL Validation: Only allows redirects to profile login routes during user auth phase
- Automatic Cleanup: Session variables cleared after successful authentication
- Access Control:
- Organizations: Verified via
organization_userpivot table - Banks: Verified via
bank_managerspivot table - Admins: Verified via
admin_userpivot table
- Organizations: Verified via
Session Variables Used:
// Common for all types
'url.intended' // Laravel's intended URL (user login phase)
'intended_profile_switch_type' // Target profile type (Organization|Bank|Admin)
'intended_profile_switch_id' // Target profile ID
// Profile-specific final redirects
'organization_login_intended_url' // Post-organization-login destination
'bank_login_intended_url' // Post-bank-login destination
'admin_login_intended_url' // Post-admin-login destination
Implementation Locations:
- Controllers:
OrganizationLoginController,BankLoginController,AdminLoginController - Custom Response:
app/Http/Responses/LoginResponse.php(handles user login redirects) - Routes:
routes/web.php(lines 434, 448, 462) - Documentation:
references/PROFILE_DIRECT_LOGIN.md
Use Case Examples:
// Email notification to organization manager
route('organization.direct-login', [
'organizationId' => $org->id,
'intended' => route('event.approve', $event->id)
])
// Bank transaction alert
route('bank.direct-login', [
'bankId' => $bank->id,
'intended' => route('transaction.review', $tx->id)
])
// Admin moderation request
route('admin.direct-login', [
'adminId' => $admin->id,
'intended' => route('report.handle', $report->id)
])
This feature maintains the security principle of layered authentication while providing seamless deep-linking capabilities for email workflows.
Session-Based Profile Management
Global Helper Functions
Located in app/Helpers/ProfileHelper.php:
- getActiveProfile(): Retrieves current active profile model from session
- getActiveProfileType(): Returns profile type name (User, Organization, Bank, Admin)
- userOwnsProfile(): Verifies user ownership of profile through relationships
Session Data Structure
Active profile information stored in encrypted session:
- Profile type (full class name)
- Profile ID and name
- Profile photo path
- Last activity timestamp
- Active guard identifier
Custom Middleware Stack
SetActiveGuard Middleware
Ensures Laravel uses the correct guard for each request based on session state.
AuthAnyGuard Middleware
Validates authentication across multiple specified guards, redirecting to login if none are authenticated.
Usage Pattern: middleware(['auth.any:admin,bank,organization,web'])
Template Security Integration
Custom Blade Directives
Registered in AppServiceProvider.php:
@profile('admin')
<div>Admin-only content</div>
@endprofile
@usercan('manage users')
<button>Manage Users</button>
@endusercan
These directives provide secure, session-aware template rendering based on active profile type and permissions.
Database-Level Security
Transaction Immutability
Critical Financial Security implemented at MySQL user permission level:
The application database user has restricted permissions where transactions can only be created (INSERT) and read (SELECT), but never modified (UPDATE) or deleted (DELETE). This ensures:
- All transactions are permanent once created
- Application cannot modify transaction history
- Complete financial audit trail maintained
- Prevents accidental or malicious transaction tampering
Model Security Patterns
- Mass Assignment Protection: Models use selective
$fillablearrays - Hidden Attributes: Sensitive fields (passwords, tokens) hidden from serialization
- Soft Deletes: Critical models use soft deletion to preserve data integrity
Session Security & Timeout Management
Profile-Specific Timeout Policies
The system supports configurable timeout periods per profile type:
- Different timeout durations based on profile privilege level
- More privileged profiles can have shorter timeout periods
- Configurable through
config/timebank-cc.php
Timeout Security Features
Implemented in CheckProfileInactivity middleware:
Graduated Timeout Behavior
- Standard Users: Configurable full logout on timeout
- Elevated Profiles: Configurable graceful demotion to User profile
- Security Principle: Higher privilege levels can have shorter timeouts
Activity Tracking Exclusions
System excludes specific routes (heartbeat, livewire updates) from resetting activity timers to prevent artificial session extension.
AJAX-Aware Timeout Responses
Provides appropriate JSON responses for timeout events in AJAX requests with proper HTTP status codes.
Session Encryption & Storage
- Database Storage: Sessions stored in database for scalability
- Encryption: All session data encrypted
- Configurable Lifetime: Base session lifetime configurable
- Secure Cookies: HTTPS-only and HttpOnly flags in production
Livewire Method-Level Authorization
Protection Against Direct Method Invocation Attacks
Critical Security Feature implemented across all admin management Livewire components to prevent unauthorized direct method calls.
The Vulnerability
Livewire components present a unique security challenge: the mount() method only executes once when the component loads. After that, any public method can be called directly via browser console:
Livewire.find('component-id').call('methodName', parameters)
If authorization is only checked in mount(), attackers can bypass these checks by calling methods directly after the component loads.
The Solution: RequiresAdminAuthorization Trait
File: app/Http/Livewire/Traits/RequiresAdminAuthorization.php
All sensitive admin operations use this trait which provides:
- ProfileAuthorizationHelper Integration: Centralized authorization with database-level validation
- Cross-Guard Attack Prevention: Validates authenticated guard matches profile type
- IDOR Prevention: Prevents access to unauthorized profiles
- Bank Level Validation: Only central bank (level=0) can access admin functions
- Performance Caching: Request-scoped caching to avoid repeated checks
Protected Components (27 Methods)
- Posts/Manage.php - 7 methods (create, edit, save, delete, undelete, publication control)
- Categories/Manage.php - 4 methods (create, update, delete operations)
- Tags/Manage.php - 3 methods (create, update, delete operations)
- Tags/Create.php - 1 method (create)
- Profiles/Manage.php - 5 methods (create, update, delete, restore, attach operations)
- Profiles/Create.php - 1 method (create) - Critical vulnerability fixed
- Mailings/Manage.php - 6 methods (create, save, send, delete operations) - Bulk delete vulnerability fixed
Usage Pattern
public function sensitiveOperation($id)
{
// CRITICAL: Authorize admin access at method level
$this->authorizeAdminAccess();
// Now safe to perform the sensitive operation
Model::find($id)->update($data);
}
Documentation
See references/LIVEWIRE_METHOD_AUTHORIZATION_SECURITY.md for comprehensive documentation including:
- Complete method inventory
- Security architecture details
- Testing requirements
- Migration guide for new components
Role-Based Access Control (RBAC)
Spatie Permissions Integration
Advanced permission system with hierarchical roles:
Role Naming Convention
// Pattern: {ProfileType}\{ProfileID}\{role-suffix}
"Admin\{id}\admin"
"Bank\{id}\bank-manager"
"Organization\{id}\organization-manager"
Permission Categories
Granular permissions for different functional areas:
- Content Management: Posts, categories, tags
- Profile Management: User profiles and accounts
- Transaction Management: Financial operations
- System Administration: Platform configuration
Permission Checking Implementation
Custom traits provide methods to verify permissions based on active profile context and role assignments.
Input Validation & Protection
CSRF Protection
- Implementation: Laravel's built-in
VerifyCsrfTokenmiddleware - Scope: All state-changing requests protected
- No Exclusions: Maximum security with no CSRF bypass routes
Hidden Captcha Protection
Time-based form submission validation:
- Minimum Submission Time: Prevents bot submissions
- Maximum Submission Time: Prevents abandoned form attacks
- Configurable Timing: Adjustable timing windows
Form Validation Security
Multi-layer validation approach:
Authorization Verification
- Model class existence validation
- Profile existence verification
- User association checking through relationships
- Hash-based verification for sensitive operations
Hash-Based Security
- Email Verification: SHA1 hash comparison prevents URL tampering
- Timing Attack Protection:
hash_equals()prevents timing analysis - Association Validation: Users must own profiles to perform actions
Legacy System Security
Cyclos Password Migration
Secure migration from legacy Cyclos system:
- Backward Compatibility: Supports existing SHA256+salt passwords
- Automatic Conversion: Migrates to Laravel hashing on successful login
- One-Time Migration: Salt removed after conversion
- Transparent Process: Users unaware of password format changes
Real-Time Security
WebSocket Authentication
Integration with Laravel Reverb and WireChat:
Multi-Guard Support
WireChat configured to work with all 4 authentication guards, ensuring real-time features respect the multi-profile system.
Presence Tracking Security
- Guard-Aware Tracking: Presence system tracks which guard user is active on
- Authentication Verification: Presence updates only for authenticated users
- Profile Context: Presence reflects current active profile type
Broadcasting Security
- Private Channels: User-specific channels prevent unauthorized access
- Authentication Requirements: Channels require proper authentication
- Event Data Security: Only necessary profile information broadcast
Route Protection Strategies
Layered Middleware Protection
Multiple middleware combinations for different security levels.
Multi-Guard Routes
Routes can specify multiple acceptable guards for flexible access control.
Guard-Specific Routes
Routes can require specific guard types for profile-type-restricted functionality.
Enhanced Security Routes
High-security routes can combine multiple middleware layers (authentication, session verification, email verification).
Activity Logging & Monitoring
Comprehensive Activity Tracking
Using Spatie ActivityLog package:
Profile Switch Logging
All profile switches logged with:
- Source and target profile information
- Timestamp and user context
- Previous login information
- Custom log categories
Selective Model Logging
Models configured to log only sensitive attribute changes to balance security with performance.
Event Broadcasting System
Profile switches and security events broadcast through:
- Private Channels: User-specific channels prevent eavesdropping
- Secure Event Data: Minimal necessary information broadcast
- Queue Processing: Events processed through authenticated queue system
Profile Inactivity Management
Automated Inactivity Detection
Configurable inactivity policies for:
- Search Visibility: Hide inactive profiles from search results
- Messenger Access: Remove inactive profiles from chat searches
- Profile Access: Control profile page visibility
- Labeling: Visual indicators for inactive status
Security Implications
- Privacy Protection: Inactive profiles automatically hidden
- Reversible Process: Profiles can be reactivated without data loss
- Configurable Behavior: All inactivity policies configurable
Email Verification Security
Multi-Profile Email Verification
Custom implementation supporting all profile types:
Association Verification
Strict verification that users own the profiles they're attempting to verify through proper relationship checking.
Hash Verification Security
Uses timing-attack-resistant hash comparison for email verification URLs.
Security Configuration Framework
Key Configuration Files
config/auth.php: Multi-guard authentication setupconfig/fortify.php: Authentication feature configurationconfig/permission.php: Role-based access control settingsconfig/hidden_captcha.php: Bot protection timing configurationconfig/timebank-cc.php: Profile timeout and security policies
Environment Security
- Database User Restrictions: Limited MySQL permissions for application user
- Session Security: Configurable encryption and storage options
- Rate Limiting: Configurable throttling for authentication attempts
- Timeout Policies: Profile-specific session timeout configuration
Security Best Practices
Defense in Depth
- Multiple Authentication Layers: Guards + middleware + permissions + database restrictions
- Input Validation: Request validation + model validation + business logic validation
- Session Security: Encryption + timeouts + activity tracking + CSRF protection
Principle of Least Privilege
- Minimal Permissions: Roles contain only necessary permissions
- Profile Isolation: Elevated profiles automatically timeout to lower privilege
- Relationship Verification: Strict ownership checks before profile access
Audit & Monitoring
- Complete Activity Logging: All profile actions tracked with configurable retention
- Real-time Event Broadcasting: Immediate notification of security events
- Comprehensive Error Logging: Detailed logging without exposing sensitive data
Secure Defaults
- Encrypted Sessions: All session data encrypted by default
- CSRF Protection: Universal CSRF verification with no exclusions
- Email Verification: Configurable verification requirements
- Password Confirmation: Required for sensitive operations
This security framework provides robust protection for the time banking platform while maintaining flexibility through comprehensive configuration options.