Role-Based Access Control

Complete guide to the RBAC system with hierarchical roles and flexible permissions

5 Tables Hierarchical Permission Overrides

πŸ“‹ Overview

The Role-Based Access Control (RBAC) system provides a hierarchical permission structure with flexible user permission overrides. This allows for granular control over user actions while maintaining a clear role hierarchy.

  • Hierarchical Roles - Each role has a level indicating its position in the hierarchy
  • Permission Groups - Permissions are organized by modules for easier management
  • User Overrides - Individual users can be granted additional permissions outside their role
  • Role Inheritance - Higher-level roles inherently have lower-level role permissions

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              RBAC SYSTEM ARCHITECTURE                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚  app_users   │────▢│ user_roles   │────▢│    roles     β”‚                β”‚
β”‚  β”‚              β”‚     β”‚ (user_id FK) β”‚     β”‚ (role_id FK) β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚                                                      β”‚                       β”‚
β”‚                                                      β–Ό                       β”‚
β”‚                                             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚                                             β”‚role_permissionsβ”‚              β”‚
β”‚                                             β”‚(many-to-many) β”‚                β”‚
β”‚                                             β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚                                                    β”‚                        β”‚
β”‚                                                    β–Ό                        β”‚
β”‚                                             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚                                             β”‚ permissions  β”‚                β”‚
β”‚                                             β”‚              β”‚                β”‚
β”‚                                             β”‚ - id         β”‚                β”‚
β”‚                                             β”‚ - name       β”‚                β”‚
β”‚                                             β”‚ - slug       β”‚                β”‚
β”‚                                             β”‚ - module     β”‚                β”‚
β”‚                                             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                    USER PERMISSION OVERRIDES                          β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”‚  β”‚
β”‚  β”‚  β”‚  app_users   │────▢│user_permissions  β”‚                          β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚(individual perms)β”‚                          β”‚  β”‚
β”‚  β”‚                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                              β”‚
β”‚  Hierarchy Levels:                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚ Level 100 β”‚ Super Admin  β”‚ Full access to everything                β”‚    β”‚
β”‚  β”‚ Level 80  β”‚ Admin         β”‚ Manage users, content, settings           β”‚    β”‚
β”‚  β”‚ Level 60  β”‚ Moderator     β”‚ Content moderation, user warnings        β”‚    β”‚
β”‚  β”‚ Level 40  β”‚ Editor        β”‚ Create and edit content                  β”‚    β”‚
β”‚  β”‚ Level 20  β”‚ User          β”‚ Standard user permissions                β”‚    β”‚
β”‚  β”‚ Level 10  β”‚ Guest         β”‚ Read-only access                         β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Table Reference

roles

Defines available roles in the system with hierarchy levels.

permissions

Defines individual permissions grouped by modules.

role_permissions

Junction table linking roles to permissions (many-to-many).

user_roles

Assigns roles to users. A user can have multiple roles.

user_permissions

Grants individual permissions to users outside their role assignments.

πŸ”‘ Default Roles

Super Admin (Level 100)

Full system access including user management, role assignments, and system configuration.

Admin (Level 80)

Administrative access for managing users, content, and settings without role assignment.

Moderator (Level 60)

Content moderation, user warnings, and community management permissions.

Editor (Level 40)

Create and edit content with publishing permissions.

User (Level 20)

Standard user permissions for creating personal content and basic interactions.

Guest (Level 10)

Read-only access for unauthenticated or limited users.

πŸ’» Usage Examples

// Assign a role to a user
$user = AppUser::find('ABC123');
$user->roles()->attach(2, [
    'assigned_by' => auth()->id(),
    'expires_at' => now()->addMonths(6),
]);

// Grant individual permission to user
$user->permissions()->attach(15, [
    'granted_by' => auth()->id(),
]);

// Check if user has permission (via role or individual)
$hasPermission = $user->roles()
    ->whereHas('permissions', function($q) use ($permissionSlug) {
        $q->where('slug', $permissionSlug);
    })->exists() || $user->permissions()->where('slug', $permissionSlug)->exists();

// Get all permissions for a user (roles + individual)
$allPermissions = $user->roles()
    ->with('permissions')
    ->get()
    ->pluck('permissions')
    ->flatten()
    ->merge($user->permissions)
    ->unique('id');

// Check role hierarchy (higher level includes lower level permissions)
$userHighestLevel = $user->roles->max('level');
$canManage = $userHighestLevel > $targetUser->roles->max('level');