Laravel Packages

Lightweight Access Control Management for Laravel with Porter

Published
Lightweight Access Control Management for Laravel with Porter image

Porter is a lightweight, blazing-fast Laravel role-based access control package created by Hassan Ibrahim, which treats roles as domain business logic rather than database abstractions. Hassan built this for developers who value simplicity, performance, and a clean architecture.

Porter's core concept emphasises that any model can be considered Assignable or Roleable, and the Roster then defines the access control relationship between them.

Features

  • Assignment-Focused Design: Treats roles as business assignments with contextual logic
  • Individual Role Classes: Each role is its own focused class extending the BaseRole
  • Ultra-Minimal Architecture: Just three core components for assignment management
  • Blazing Performance: Optimised for speed with minimal database interaction and built-in caching
  • Enhanced Security: Assignment keys encrypted with Laravel's built-in encryption
  • Automatic RoleCast: Seamless conversion between database keys and type-safe RoleContract instances
  • Perfect Laravel Integration: Custom Blade directives, middleware, plus seamless Gates and Policies

Basic Example

use Hdaklue\Porter\Facades\Porter;

// Assign a role
Porter::assign($user, $project, 'admin');

// Check the user's role
$isAdmin = $user->hasRoleOn($project, 'admin');

// Remove a role
Porter::remove($user, $project);

// Change the role
Porter::changeRoleOn($user, $project, 'editor');

Porter also provides an interactive Artisan command that allows you to create role classes.

php artisan porter:create

An example role class might look like:

use App\Porter\BaseRole; // Your application's base role

final class AssistantRegionalManager extends BaseRole
{
    public function getName(): string
    {
        return 'assistant_regional_manager';
    }

    public function getLevel(): int
    {
        return 8;
    }
    
    public function getDescription(): string
    {
        return "The beet-loving, karate-chopping, all-around office superhero we didn't know we needed";
    }
}

You can also integrate this with your Laravel models with the CanBeAssignedToEntity and ReceivesRoleAssignments traits:

use Hdaklue\Porter\Concerns\{CanBeAssignedToEntity, ReceivesRoleAssignments};

class User extends Authenticatable
{
    use CanBeAssignedToEntity;
    
    // Your existing User model code...
}

class Project extends Model  
{
    use ReceivesRoleAssignments;
    
    // Your existing Project model code...
}

As of this writing, Porter is still relatively new, and Hassan is keen to get input and some additional help from the community with some other potential features.

To learn more about this package, contribute to it, and view the source code. You can find the repository on GitHub.

Yannick Lyn Fatt photo

Staff Writer at Laravel News and Full stack web developer.

Sponsored

serpapi logo
SerpApi

The Web Search API for Your LLM and AI Applications

Visit SerpApi

The latest

View all →
Laravel Herd 2: Coding Agents, Workspaces, and Cloud Deploys image

Laravel Herd 2: Coding Agents, Workspaces, and Cloud Deploys

Read article
Strict Request Input Casting in Laravel image

Strict Request Input Casting in Laravel

Read article
Prevent Duplicate File Uploads With Laravel Storage Dedupler image

Prevent Duplicate File Uploads With Laravel Storage Dedupler

Read article
Slow Job Alerts and Replica Commit IDs in Laravel 13.40 image

Slow Job Alerts and Replica Commit IDs in Laravel 13.40

Read article
Flock: A Free, Native Herd Alternative for Laravel image

Flock: A Free, Native Herd Alternative for Laravel

Read article
Live Props for Real-Time Updates in Inertia.js v3.11 image

Live Props for Real-Time Updates in Inertia.js v3.11

Read article