PHP Classes

How to Control the Execution of Action on Specific Object Using Ability Control Using the Laravel Permission Package Laravel Simple Permissions: Manage permissions and roles of Laravel users

Recommend this page to a friend!
  Info   Documentation   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2025-12-06 (29 days ago) RSS 2.0 feedNot yet rated by the usersTotal: Not yet counted Not yet ranked
Version License PHP version Categories
laravelsimplepermiss 1.0MIT/X Consortium ...7User Management, PHP 7
Description 

Authors

Alberto Rial Barreiro
Jacobo Cantorna Cigarrán


Contributor

This package can manage permissions and roles of Laravel models.

It provides traits that can be used with the user model class to add the management of user permissions and roles.

Currently, the package allows to:

- Create roles

- Create permissions

- Assign permissions to roles

- Assign roles to users and remove roles from users

- Check if a user has a permission, a role or an ability

- Create groups, assign permissions to groups, add and remove users from groups

- Allow, forbid and remove ability for a user to execute an action using another object

- Use middleware to route requests to different controllers depending on the user permissions

Picture of Jacobo Cantorna Cigarrán
  Performance   Level  
Name: Jacobo Cantorna Cigarrán <contact>
Classes: 5 packages by
Country: Spain Spain
Age: 45
All time rank: Not yet ranked
Week rank: Not yet ranked
Innovation award
Innovation award
Nominee: 2x

Instructions

Documentation

Squareetlabs/LaravelSimplePermissions

Latest Stable Version PHP Version Require License

A comprehensive and flexible Laravel package for advanced permission management. This package provides a robust system for managing roles, permissions, groups, and entity-specific abilities.

Core Functionality:

  • Role-Based Access Control (RBAC): Define custom roles with specific permission sets. Roles can be assigned to users to manage access levels efficiently.
  • Permission System: Implement fine-grained permissions using a code-based system (e.g., `posts.create`, `users.edit`). Permissions are global entities that can be assigned to roles and groups. Supports wildcard permissions for flexible access patterns.
  • Group Management: Organize users into groups. Groups can have their own permission sets, allowing for efficient permission management when multiple users need the same access level.
  • Entity-Specific Abilities: Grant or deny permissions for specific model instances (e.g., allowing a user to edit a particular post but not others). This provides the most granular level of access control.
  • Caching & Performance: Intelligent caching system to optimize permission checks, reducing database queries and improving application performance.
  • Audit Logging: Optional comprehensive audit trail that logs all permission-related actions including role assignments and permission changes.
  • Laravel Integration: Seamlessly integrates with Laravel's built-in authorization system, including Policies, Blade directives, and middleware for route protection.

Key Features

  • ? Roles & Permissions: Flexible role system with granular permissions
  • ? Groups: Organize users into groups with shared permissions
  • ? Abilities: Entity-specific permissions for individual models
  • ? Smart Caching: Caching system to optimize permission checks
  • ? Audit Logging: Complete action logging (optional)
  • ? Blade Directives: Blade directives for permission checks in views
  • ? Policies: Integration with Laravel's Policy system
  • ? Middleware: Middleware for route protection
  • ? Artisan Commands: CLI tools for management
  • ? Events: Event system for permission changes (RoleAssigned, RoleRemoved, AbilityGranted, AbilityRevoked)
  • ? Validation: Automatic validation of permission codes
  • ? Performance: Optimized queries with eager loading

Requirements

  • PHP >= 8.1
  • Laravel 8.x, 9.x, 10.x, 11.x or 12.x

Installation

1. Install the Package

composer require squareetlabs/laravel-simple-permissions

2. Publish Configuration and Migrations

php artisan vendor:publish --provider="Squareetlabs\LaravelSimplePermissions\SimplePermissionsServiceProvider"

This will publish: - config/simple-permissions.php - Configuration file - Database migrations

3. Configure the User Model

Add the HasPermissions trait to your User model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Squareetlabs\LaravelSimplePermissions\Traits\HasPermissions;

class User extends Model
{
    use HasPermissions;
    
    // ... rest of your code
}

4. Run Migrations

> ?? IMPORTANT: Always do backups before running migrations.

php artisan migrate

> [!NOTE] > If you wish to use custom foreign keys and table names, modify config/simple-permissions.php before running migrations.

5. Optional Configuration

Enable Caching

To improve performance, enable caching in .env:

SIMPLE_PERMISSIONS_CACHE_ENABLED=true
SIMPLE_PERMISSIONS_CACHE_DRIVER=redis
SIMPLE_PERMISSIONS_CACHE_TTL=3600

Enable Audit Logging

To log all permission actions:

SIMPLE_PERMISSIONS_AUDIT_ENABLED=true
SIMPLE_PERMISSIONS_AUDIT_LOG_CHANNEL=stack

Configuration

The configuration file config/simple-permissions.php contains all options:

Custom Models

'models' => [
    'user' => App\Models\User::class,
    // ... other models
],

Cache

'cache' => [
    'enabled' => env('SIMPLE_PERMISSIONS_CACHE_ENABLED', true),
    'driver' => env('SIMPLE_PERMISSIONS_CACHE_DRIVER', 'redis'),
    'ttl' => env('SIMPLE_PERMISSIONS_CACHE_TTL', 3600),
    'prefix' => 'simple_permissions',
    'tags' => true,
],

Basic Usage

Creating Roles and Permissions

use Squareetlabs\LaravelSimplePermissions\Support\Facades\SimplePermissions;

// Create permissions
$viewPost = SimplePermissions::model('permission')::create(['code' => 'posts.view', 'name' => 'View Posts']);
$createPost = SimplePermissions::model('permission')::create(['code' => 'posts.create', 'name' => 'Create Posts']);

// Create role
$adminRole = SimplePermissions::model('role')::create(['code' => 'admin', 'name' => 'Administrator']);

// Assign permissions to role
$adminRole->permissions()->attach([$viewPost->id, $createPost->id]);

Assigning Roles to Users

// Assign role to user
$user->assignRole('admin');

// Remove role from user
$user->removeRole('admin');

// Sync roles (replaces all existing roles)
$user->syncRoles(['admin', 'editor']);

Checking Permissions

// Check if user has a permission (direct or via role/group)
if ($user->hasPermission('posts.create')) {
    // User can create posts
}

// Check if user has a role
if ($user->hasRole('admin')) {
    // User is admin
}

// Check specific ability on an entity
if ($user->hasAbility('edit', $post)) {
    // User can edit this specific post
}

Users

The HasPermissions trait provides the following methods:

// Check if user has a role (or roles)
// $require = true: all roles are required
// $require = false: at least one of the roles
$user->hasRole('admin', $require = false)
$user->hasRole(['admin', 'editor'], $require = false)

// Check if user has a permission (or permissions)
// $require = true: all permissions are required
// $require = false: at least one of the permissions
$user->hasPermission('posts.create', $require = false)
$user->hasPermission(['posts.create', 'posts.edit'], $require = false)

// Check if user has an ability on an entity
$user->hasAbility('posts.edit', $post)

// Allow ability for user on an entity
$user->allowAbility('posts.edit', $post)

// Forbid ability for user on an entity
$user->forbidAbility('posts.edit', $post)

// Remove ability from user
$user->removeAbility('posts.edit', $post)

Roles & Permissions

Wildcard Permissions

You can use wildcards for permissions:

  • `posts.*` - All permissions starting with `posts.`
  • `*` - All permissions (if enabled in config)

Checking Permissions

// Check multiple permissions (OR)
if ($user->hasPermission(['posts.create', 'posts.edit'], false)) {
    // User can create OR edit posts
}

// Check multiple permissions (AND)
if ($user->hasPermission(['posts.create', 'posts.edit'], true)) {
    // User can create AND edit posts
}

Abilities

Abilities allow specific permissions for individual entities.

Creating and Assigning Abilities

You can use helper methods for easier ability management:

// Allow user to edit a specific post
$user->allowAbility('posts.edit', $post);

// Forbid user to edit a specific post
$user->forbidAbility('posts.edit', $post);

// Remove ability from user
$user->removeAbility('posts.edit', $post);

Or use the direct approach:

use Squareetlabs\LaravelSimplePermissions\Support\Facades\SimplePermissions;

// Create a permission first
$permission = SimplePermissions::model('permission')::create(['code' => 'posts.edit']);

// Create an ability for a specific entity
$ability = SimplePermissions::model('ability')::create([
    'permission_id' => $permission->id,
    'title' => 'Edit Post #1',
    'entity_id' => $post->id,
    'entity_type' => get_class($post),
]);

// Allow user to edit a specific post
$ability->users()->attach($user, ['forbidden' => false]);

// Forbid user to edit a specific post
$ability->users()->attach($user, ['forbidden' => true]);

// Remove ability from user
$ability->users()->detach($user);

Checking an Ability

if ($user->hasAbility('posts.edit', $post)) {
    // User can edit this specific post
}

Groups

Groups allow organizing users with shared permissions.

Creating and Managing Groups

use Squareetlabs\LaravelSimplePermissions\Support\Facades\SimplePermissions;

// Create group
$group = SimplePermissions::model('group')::create(['code' => 'moderators', 'name' => 'Moderators']);

// Assign permissions to group
$permission = SimplePermissions::model('permission')::where('code', 'posts.moderate')->first();
$group->permissions()->attach($permission);

// Add users to group
$group->users()->attach($user);

// Remove users from group
$group->users()->detach($user);

Middleware

The package provides middleware for route protection.

Usage in Routes

// Check role
Route::middleware(['role:admin'])->group(function () {
    Route::get('/admin', [AdminController::class, 'index']);
});

// Check permission
Route::middleware(['permission:posts.create'])->group(function () {
    Route::post('/posts', [PostController::class, 'store']);
});

// Check ability
// Format: ability:action,entity_class,route_parameter_name
Route::middleware(['ability:edit,App\Models\Post,post_id'])->group(function () {
    Route::put('/posts/{post_id}', [PostController::class, 'update']);
});

OR Operations

// User must have admin OR root
Route::middleware(['role:admin|root'])->group(function () {
    // ...
});

Blade Directives

The package includes Blade directives for permission checks in views:

{{-- Check role --}}
@role('admin')
    <button>Admin Panel</button>
@endrole

{{-- Check permission --}}
@permission('posts.create')
    <a href="{{ route('posts.create') }}">New Post</a>
@endpermission

{{-- Check ability --}}
@ability('edit', $post)
    <button>Edit Post</button>
@endability

Policies

The package integrates with Laravel's Policy system.

Generate a Policy

php artisan permissions:policy PostPolicy --model=Post

Using the Policy

// In a controller
if ($user->can('view', $post)) {
    // User can view the post
}

// In a view
@can('update', $post)
    <button>Edit</button>
@endcan

Events

The package dispatches events when permissions change, allowing you to hook into these actions:

Available Events

  • `RoleAssigned`: Dispatched when a role is assigned to a user
  • `RoleRemoved`: Dispatched when a role is removed from a user
  • `AbilityGranted`: Dispatched when an ability is granted to a user
  • `AbilityRevoked`: Dispatched when an ability is revoked from a user

Listening to Events

use Squareetlabs\LaravelSimplePermissions\Events\RoleAssigned;
use Squareetlabs\LaravelSimplePermissions\Events\AbilityGranted;

// In your EventServiceProvider
protected $listen = [
    RoleAssigned::class => [
        // Your listeners here
    ],
    AbilityGranted::class => [
        // Your listeners here
    ],
];

Example Listener

use Squareetlabs\LaravelSimplePermissions\Events\RoleAssigned;

class LogRoleAssignment
{
    public function handle(RoleAssigned $event)
    {
        // Log the role assignment
        Log::info("User {$event->user->id} was assigned role {$event->role->code}");
    }
}

Artisan Commands

The package includes several useful commands:

Management

// List all roles
php artisan permissions:roles

// Show role details
php artisan permissions:show-role {role}

// List all permissions
php artisan permissions:list

// Sync permissions from configuration
php artisan permissions:sync

// Export permissions
php artisan permissions:export --format=json

// Import permissions
php artisan permissions:import --file=permissions.json

// Clear permissions cache
php artisan permissions:clear-cache

// Generate a policy
php artisan permissions:policy PostPolicy --model=Post

  Files folder image Files (68)  
File Role Description
Files folder imageconfig (1 file)
Files folder imagedatabase (1 directory)
Files folder imagesrc (1 file, 9 directories)
Files folder imagetests (2 files, 4 directories)
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file CONTRIBUTING.md Data Auxiliary data
Accessible without login Plain text file LICENSE.md Lic. License text
Accessible without login Plain text file phpstan.neon Data Auxiliary data
Accessible without login Plain text file phpunit.xml.dist Data Auxiliary data
Accessible without login Plain text file pint.json Data Auxiliary data
Accessible without login Plain text file README.md Doc. Read me

  Files folder image Files (68)  /  config  
File Role Description
  Plain text file simple-permissions.php Class Class source

  Files folder image Files (68)  /  database  
File Role Description
Files folder imagemigrations (10 files)

  Files folder image Files (68)  /  database  /  migrations  
File Role Description
  Plain text file add_performance_indexes.php Class Class source
  Plain text file create_abilities_table.php Class Class source
  Plain text file create_audit_logs_table.php Class Class source
  Plain text file create_entity_ability_table.php Class Class source
  Plain text file create_entity_permission_table.php Class Class source
  Plain text file create_groups_table.php Class Class source
  Plain text file create_group_user_table.php Class Class source
  Plain text file create_permissions_table.php Class Class source
  Plain text file create_roles_table.php Class Class source
  Plain text file create_role_user_table.php Class Class source

  Files folder image Files (68)  /  src  
File Role Description
Files folder imageConsole (9 files)
Files folder imageEnums (1 file)
Files folder imageEvents (4 files)
Files folder imageExceptions (1 file)
Files folder imageMiddleware (4 files)
Files folder imageModels (6 files)
Files folder imageRules (1 file)
Files folder imageSupport (2 directories)
Files folder imageTraits (1 file)
  Plain text file SimplePermissionsServiceProvider.php Class Class source

  Files folder image Files (68)  /  src  /  Console  
File Role Description
  Plain text file InstallCommand.php Class Class source
  Plain text file MakePolicyCommand.php Class Class source
  Plain text file PermissionsClearCacheCommand.php Class Class source
  Plain text file PermissionsCommand.php Class Class source
  Plain text file PermissionsExportCommand.php Class Class source
  Plain text file PermissionsImportCommand.php Class Class source
  Plain text file PermissionsListCommand.php Class Class source
  Plain text file PermissionsShowCommand.php Class Class source
  Plain text file PermissionsSyncCommand.php Class Class source

  Files folder image Files (68)  /  src  /  Enums  
File Role Description
  Accessible without login Plain text file AccessLevel.php Aux. Configuration script

  Files folder image Files (68)  /  src  /  Events  
File Role Description
  Plain text file AbilityGranted.php Class Class source
  Plain text file AbilityRevoked.php Class Class source
  Plain text file RoleAssigned.php Class Class source
  Plain text file RoleRemoved.php Class Class source

  Files folder image Files (68)  /  src  /  Exceptions  
File Role Description
  Plain text file AuditTableMissingException.php Class Class source

  Files folder image Files (68)  /  src  /  Middleware  
File Role Description
  Plain text file Ability.php Class Class source
  Plain text file Permission.php Class Class source
  Plain text file Role.php Class Class source
  Plain text file SimplePermissionsMiddleware.php Class Class source

  Files folder image Files (68)  /  src  /  Models  
File Role Description
  Plain text file Ability.php Class Class source
  Plain text file AuditLog.php Class Class source
  Plain text file Group.php Class Class source
  Plain text file Owner.php Class Class source
  Plain text file Permission.php Class Class source
  Plain text file Role.php Class Class source

  Files folder image Files (68)  /  src  /  Rules  
File Role Description
  Plain text file ValidPermission.php Class Class source

  Files folder image Files (68)  /  src  /  Support  
File Role Description
Files folder imageFacades (1 file)
Files folder imageServices (3 files)

  Files folder image Files (68)  /  src  /  Support  /  Facades  
File Role Description
  Plain text file SimplePermissions.php Class Class source

  Files folder image Files (68)  /  src  /  Support  /  Services  
File Role Description
  Plain text file AuditService.php Class Class source
  Plain text file PermissionCache.php Class Class source
  Plain text file SimplePermissionsService.php Class Class source

  Files folder image Files (68)  /  src  /  Traits  
File Role Description
  Plain text file HasPermissions.php Class Class source

  Files folder image Files (68)  /  tests  
File Role Description
Files folder imagedatabase (1 directory)
Files folder imageFeature (2 files, 1 directory)
Files folder imageModels (1 file)
Files folder imageUnit (4 directories)
  Plain text file Pest.php Class Class source
  Plain text file TestCase.php Class Class source

  Files folder image Files (68)  /  tests  /  database  
File Role Description
Files folder imagefactories (1 file)

  Files folder image Files (68)  /  tests  /  database  /  factories  
File Role Description
  Plain text file UserFactory.php Class Class source

  Files folder image Files (68)  /  tests  /  Feature  
File Role Description
Files folder imageMiddleware (3 files)
  Plain text file CacheTest.php Class Class source
  Plain text file PermissionCheckingTest.php Class Class source

  Files folder image Files (68)  /  tests  /  Feature  /  Middleware  
File Role Description
  Plain text file AbilityMiddlewareTest.php Class Class source
  Plain text file PermissionMiddlewareTest.php Class Class source
  Plain text file RoleMiddlewareTest.php Class Class source

  Files folder image Files (68)  /  tests  /  Models  
File Role Description
  Plain text file User.php Class Class source

  Files folder image Files (68)  /  tests  /  Unit  
File Role Description
Files folder imageEvents (1 file)
Files folder imageModels (4 files)
Files folder imageServices (2 files)
Files folder imageTraits (2 files)

  Files folder image Files (68)  /  tests  /  Unit  /  Events  
File Role Description
  Plain text file PermissionEventsTest.php Class Class source

  Files folder image Files (68)  /  tests  /  Unit  /  Models  
File Role Description
  Plain text file AbilityTest.php Class Class source
  Plain text file GroupTest.php Class Class source
  Plain text file PermissionTest.php Class Class source
  Plain text file RoleTest.php Class Class source

  Files folder image Files (68)  /  tests  /  Unit  /  Services  
File Role Description
  Plain text file AuditServiceTest.php Class Class source
  Plain text file PermissionCacheTest.php Class Class source

  Files folder image Files (68)  /  tests  /  Unit  /  Traits  
File Role Description
  Plain text file AbilityHelperMethodsTest.php Class Class source
  Plain text file HasPermissionsTest.php Class Class source

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads  
 100%
Total:0
This week:0