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

masteringlaravel logo
Laravel Code Review

Get expert guidance in a few days with a Laravel code review

Visit Laravel Code Review

The latest

View all →
Fluent Rule Builders for All Laravel Validation Rules image

Fluent Rule Builders for All Laravel Validation Rules

Read article
Laravel URL AI Transformer: Extract Structured Data From URLs image

Laravel URL AI Transformer: Extract Structured Data From URLs

Read article
Rule Builders for Every Validation Rule in Laravel 13.36 image

Rule Builders for Every Validation Rule in Laravel 13.36

Read article
PHP News: A New Site for PHP Releases, RFCs, and Packages image

PHP News: A New Site for PHP Releases, RFCs, and Packages

Read article
Pause Polling in Background Tabs in Inertia.js v3.9 image

Pause Polling in Background Tabs in Inertia.js v3.9

Read article
Look What You Helped Me Build image

Look What You Helped Me Build

Read article