Skip to content

Roles and Permissions

Role-based access control (RBAC) using spatie/laravel-permission v6 with PHP enums for type-safe permission management.

The system uses:

  • PHP Enums for type-safe roles and permissions
  • Spatie Permission package for RBAC infrastructure
  • Wildcard permissions for admin full access
  • FilamentPHP trait for automatic resource authorization
use App\Enums\Role;
$user->assignRole(Role::Admin->value);
$user->assignRole(Role::DmcManager->value);
use App\Enums\Permission;
// Using enum (recommended)
if ($user->can(Permission::ViewUser->value)) {
// User can view users
}
// Using string
if ($user->can('view_user')) {
// User can view users
}
use App\Enums\Role;
if ($user->hasRole(Role::Admin->value)) {
// User is admin
}

Full system access via wildcard (*) permission.

PropertyValue
Slugadmin
Iconheroicon-o-shield-check
Colordanger (red)
ScopeGlobal

Capabilities: All permissions on all resources.

Limited access to DMC-related resources only.

PropertyValue
Slugdmc-manager
Iconheroicon-o-building-office-2
Colorinfo (blue)
ScopeDMC-scoped

Capabilities:

  • Full CRUD on DMCs
  • Full CRUD on Offers
  • Full CRUD on Travel Products

Restrictions (no access to):

  • Users, Activity Logs
  • Markets, Market Products
  • Flight Search, Flight Bookings
  • Hotels, Airports
  • Clients, Passengers
{action}_{resource}

Actions: view, create, update, delete

Examples:

  • view_user - View user records
  • create_dmc - Create new DMC
  • update_offer - Update offers
  • delete_travel_product - Delete travel products
ResourceViewCreateUpdateDelete
Userview_usercreate_userupdate_userdelete_user
Clientview_clientcreate_clientupdate_clientdelete_client
Hotelview_hotelcreate_hotelupdate_hoteldelete_hotel
Airportview_airportcreate_airportupdate_airportdelete_airport
Marketview_marketcreate_marketupdate_marketdelete_market
DMCview_dmccreate_dmcupdate_dmcdelete_dmc
Offerview_offercreate_offerupdate_offerdelete_offer
Travel Productview_travel_productcreate_travel_productupdate_travel_productdelete_travel_product

Add to Filament resources for automatic permission checks:

use App\Filament\Traits\HasResourcePermissions;
class UserResource extends Resource
{
use HasResourcePermissions;
// Resource implementation...
}

The trait automatically:

  • Derives permission prefix from model name (User -> user, FlightBooking -> flight_booking)
  • Hides navigation for unauthorized resources
  • Checks view, create, update, delete permissions
app/Enums/Permission.php
enum Permission: string
{
// ... existing permissions
// New resource (4 permissions)
case ViewInvoice = 'view_invoice';
case CreateInvoice = 'create_invoice';
case UpdateInvoice = 'update_invoice';
case DeleteInvoice = 'delete_invoice';
}
// If DMC Managers should access the new resource
public static function dmcManagerPermissions(): array
{
return [
// ... existing permissions
self::ViewInvoice,
self::CreateInvoice,
self::UpdateInvoice,
self::DeleteInvoice,
];
}
Terminal window
./vendor/bin/sail artisan db:seed --class=RolesAndPermissionsSeeder

Use Permission enum for type-safe policy checks:

use App\Enums\Permission;
use App\Models\User;
class InvoicePolicy
{
public function viewAny(User $user): bool
{
return $user->can(Permission::ViewInvoice->value);
}
public function create(User $user): bool
{
return $user->can(Permission::CreateInvoice->value);
}
public function update(User $user, Invoice $invoice): bool
{
return $user->can(Permission::UpdateInvoice->value);
}
public function delete(User $user, Invoice $invoice): bool
{
return $user->can(Permission::DeleteInvoice->value);
}
}

Spatie Permission caches roles and permissions. Clear cache after changes:

Terminal window
./vendor/bin/sail artisan permission:cache-reset
  1. Check user has correct role:

    $user->getRoleNames(); // ['admin'] or ['dmc-manager']
  2. Check role has permission:

    $user->getAllPermissions()->pluck('name');
  3. Clear permission cache:

    Terminal window
    ./vendor/bin/sail artisan permission:cache-reset

Ensure resource uses HasResourcePermissions trait:

class DMCResource extends Resource
{
use HasResourcePermissions;
}
FilePurpose
app/Enums/Permission.phpPermission enum with 48 CRUD permissions
app/Enums/Role.phpRole enum with Admin and DmcManager
app/Filament/Traits/HasResourcePermissions.phpFilament authorization trait
database/seeders/RolesAndPermissionsSeeder.phpSeeds roles and permissions