PHPackages                             hosseinhezami/laravel-permission-manager - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. hosseinhezami/laravel-permission-manager

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

hosseinhezami/laravel-permission-manager
========================================

Advanced permission manager for Laravel.

1.0.1(7mo ago)403.3k↓50%MITPHPPHP ^8.2|^8.3|^8.4|^8.5CI passing

Since Sep 24Pushed 7mo ago1 watchersCompare

[ Source](https://github.com/hosseinhezami/laravel-permission-manager)[ Packagist](https://packagist.org/packages/hosseinhezami/laravel-permission-manager)[ RSS](/packages/hosseinhezami-laravel-permission-manager/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (2)Dependencies (1)Versions (3)Used By (0)

Laravel Permission Manager
==========================

[](#laravel-permission-manager)

A comprehensive and advanced permission management system for Laravel applications. This package provides a robust role-based access control (RBAC) system with support for wildcard permissions, blade directives, Artisan commands, and a fluent API.

[![Version](https://camo.githubusercontent.com/46ed2904922104717a084d3bf4e3c4abc1ba5ccf58f6ac56df7f8bbed33404a1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f686f737365696e68657a616d692f6c61726176656c2d7065726d697373696f6e2d6d616e616765722e737667)](https://packagist.org/packages/hosseinhezami/laravel-permission-manager)[![Downloads](https://camo.githubusercontent.com/f215492d12ed4f581989569c66271618144b78ffaf76f4fc91515a21990b0d6e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f686f737365696e68657a616d692f6c61726176656c2d7065726d697373696f6e2d6d616e616765722e737667)](https://packagist.org/packages/hosseinhezami/laravel-permission-manager)[![Star](https://camo.githubusercontent.com/643d7bdb89c12aed7dde565e953188a99439df1abf646bc1a1dc464a1d8a9a0c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f73746172732f686f737365696e68657a616d692f6c61726176656c2d7065726d697373696f6e2d6d616e616765722e737667)](https://packagist.org/packages/hosseinhezami/laravel-permission-manager)[![License](https://camo.githubusercontent.com/44a7c18ed833d9e26f87dc42405eaf9dc9ae89928157b90dc1cc8a5799fcaf4b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f686f737365696e68657a616d692f6c61726176656c2d7065726d697373696f6e2d6d616e616765722e737667)](https://packagist.org/packages/hosseinhezami/laravel-permission-manager)[![Laravel Compatible](https://camo.githubusercontent.com/30ed7e63c5c0756f6adcba531b17f675688ccf82890a93438dcb9cc706d2e0c6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d31302532422d627269676874677265656e2e737667)](https://hosseinhezami.github.io/laravel-permission-manager)

Features
--------

[](#features)

- **Role-Based Access Control (RBAC)**: Assign multiple roles to users, and permissions to roles.
- **Multiple Roles**: Support for multiple roles per user.
- **Route-Based Permissions**: Permissions are tied to Laravel route names (e.g., `users`).
- **Wildcard Support**: Use wildcards for permissions (e.g., `admin.*`, `admin*`, `*admin`, `*admin*`) for flexible route matching.
- **Blade Directives**: Easily check roles and permissions in Blade templates (`@hasRole`, `@hasPermission`).
- **Facade Methods**: Conveniently manage roles, permissions, and users via the `PermissionManager` facade.
- **Console Commands**: Comprehensive Artisan commands for managing roles and permissions.
- **Caching**: Permissions are cached for performance.
- **Exceptions**: Custom exceptions for robust error handling.
- **Multi-Guard Support**: Works with Laravel's authentication guards.
- **Export/Import**: Export roles and permissions to JSON and import them back.
- **Middleware**: Protect routes with role or permission checks (`pm`, `pm:role:admin|editor`).
- **User Trait**: Adds role and permission methods to the User model.
- **Easy Installation**: Auto-discovery for easy installation.

Installation
------------

[](#installation)

1. Install the package via Composer:

```
composer require HosseinHezami/laravel-permission-manager
```

2. (Optional) If Laravel's package auto-discovery is disabled, add the service provider and facade to `config/app.php`:

```
'providers' => [
    // ...
    HosseinHezami\PermissionManager\PermissionManagerServiceProvider::class,
],
'aliases' => [
    // ...
    'PermissionManager' => HosseinHezami\PermissionManager\Facades\PermissionManager::class,
],
```

3. Publish the configuration and migrations:

```
php artisan vendor:publish --provider="HosseinHezami\PermissionManager\PermissionManagerServiceProvider" --tag="config"
php artisan vendor:publish --provider="HosseinHezami\PermissionManager\PermissionManagerServiceProvider" --tag="migrations"
```

4. Run the migrations to create the necessary tables:

```
php artisan migrate
```

5. Add the `PermissionTrait` trait to your `User` model:

```
namespace App\Models;

use HosseinHezami\PermissionManager\Traits\PermissionTrait;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use PermissionTrait;
}
```

To run the install command which sets up the configuration and optionally adds the trait to your User model:

```
# Install the permission manager package with default settings
php artisan permission-manager:install
```

```
# Install and automatically run the migrations for permission tables
php artisan permission-manager:install --migrate
```

```
# Install, run migrations and force overwrite existing files if any
php artisan permission-manager:install --migrate --force
```

```
# Install with custom User model path to automatically add the PermissionTrait trait
php artisan permission-manager:install --user-model=/path/to/User.php
```

### Configuration

[](#configuration)

After publishing the configuration file, you can customize the package behavior in `config/permission-manager.php`:

```
return [
    'models' => [
        'role' => \HosseinHezami\PermissionManager\Models\Role::class,
        'permission' => \HosseinHezami\PermissionManager\Models\Permission::class,
        'user' => \App\Models\User::class,
    ],
    'tables' => [
        'roles' => 'roles',
        'permissions' => 'permissions',
        'role_permissions' => 'role_permissions',
        'user_roles' => 'user_roles',
    ],
    'cache_duration' => 60, // Cache permissions for 60 minutes
    'log_denials' => false, // Log permission/role denials
    'wildcards' => true, // Enable wildcard support
];
```

Database Migrations
-------------------

[](#database-migrations)

The package includes the following database migrations:

```
Schema::create('roles', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('slug')->unique();
    $table->text('description')->nullable();
    $table->timestamps();
});

Schema::create('permissions', function (Blueprint $table) {
    $table->id();
    $table->string('route')->unique();
    $table->timestamps();
});

Schema::create('role_permissions', function (Blueprint $table) {
    $table->unsignedBigInteger('role_id');
    $table->unsignedBigInteger('permission_id');
    $table->primary(['role_id','permission_id']);
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
    $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
    $table->timestamps();
});

Schema::create('user_roles', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');
    $table->unsignedBigInteger('role_id');
    $table->primary(['user_id','role_id']);
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
    $table->timestamps();
});
```

Usage
-----

[](#usage)

### Blade Directives

[](#blade-directives)

Check for roles in your Blade templates:

```

@hasRole('admin')

@endhasRole

@hasPermission('users.edit')

@endhasPermission
```

### Middleware

[](#middleware)

Protect your routes with middleware:

```
//  ->middleware('pm');
Route::get('/admin', [AdminController::class, 'index'])
    ->middleware('pm:role:admin|manager');
Route::get('/posts', [PostController::class, 'create'])
    ->middleware('pm:permission:posts|post.create');
```

### Artisan Commands

[](#artisan-commands)

The package provides several Artisan commands for managing roles and permissions:

```
# List all roles
php artisan roles:list

# List all permissions
php artisan permissions:list

# Create a new role
php artisan role:create admin "Administrator" "Has full system access"

# Update a role
php artisan role:update admin --name="Super Admin" --description="Updated description"

# Delete a role
php artisan role:delete admin

# Create permissions
php artisan permission:create "users.*"
php artisan permission:create "users.create,users.edit"

# Delete permissions
php artisan permission:delete "users.edit"
php artisan permission:delete "users.create,users.edit"

# Sync routes with permissions table
php artisan permission:sync-routes

# Assign permissions to a role
php artisan role:assign-permission admin "users.*"
php artisan role:assign-permission admin "users.create,users.edit"

# Revoke permissions from a role
php artisan role:revoke-permission admin "users.edit"

# Export roles to a JSON file
php artisan role:export roles.json

# Import roles from a JSON file
php artisan role:import roles.json

# Assign roles to a user
php artisan user:assign-role 1 admin
php artisan user:assign-role 1 "admin,editor"

# Revoke roles from a user
php artisan user:revoke-role 1 admin
```

### Facade Methods

[](#facade-methods)

Use the facade for programmatic management:

```
use HosseinHezami\PermissionManager\Facades\PermissionManager;

// Get all roles
$roles = PermissionManager::roles()->list();

// Get all permissions
$permissions = PermissionManager::permissions()->list();

// Sync routes with permissions
PermissionManager::permissions()->sync();

// Create permissions
PermissionManager::permissions()->create('users.create');
PermissionManager::permissions()->create(['users.create', 'users.edit']);

// Delete permissions
PermissionManager::permissions()->delete('users.create');
PermissionManager::permissions()->delete(['users.create', 'users.edit']);

// Create a role
PermissionManager::roles()->create([
    'slug' => 'admin',
    'name' => 'Administrator',
    'description' => 'Has full system access'
]);

// Role operations
PermissionManager::role('admin')->assignPermission('users.edit');
PermissionManager::role('admin')->revokePermission('users.edit');
PermissionManager::role('admin')->update(['name' => 'Super Admin']);
PermissionManager::role('admin')->delete();

// User operations
PermissionManager::user($userId)->assignRole(['admin', 'editor']);
PermissionManager::user($userId)->revokeRole('admin');
$roles = PermissionManager::user($userId)->roles();
$permissions = PermissionManager::user($userId)->permissions();
$hasRole = PermissionManager::user($userId)->hasRole('admin');
$hasPermission = PermissionManager::user($userId)->hasPermission('users.edit');
```

### Wildcard Permissions

[](#wildcard-permissions)

The package supports wildcard permissions for flexible route matching:

```
// Match all routes starting with 'admin'
'admin.*'

// Match all routes ending with '.admin'
'*.admin'

// Match all routes containing 'admin'
'*admin*'
```

### Trait Methods

[](#trait-methods)

The `PermissionTrait` trait adds these methods to your User model:

```
// Get all roles
$user->roles;

// Get all permissions (including through roles)
$user->permissions();

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

// Revoke a role
$user->revokeRole('admin');

// Check if user has a role
$user->hasRole('admin');

// Check if user has a permission
$user->hasPermission('users.edit');
```

Exceptions
----------

[](#exceptions)

The package includes custom exceptions for better error handling:

- `PermissionAlreadyExists`
- `PermissionDoesNotExist`
- `RoleAlreadyExists`
- `RoleDoesNotExist`
- `UnauthorizedException`

Best Practices
--------------

[](#best-practices)

1. Use meaningful role slugs and permission routes
2. Utilize wildcard permissions for related routes
3. Regularly sync routes with permissions to keep them up to date
4. Use the cache feature in production for better performance
5. Handle exceptions appropriately in your application

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](CONTRIBUTING.md) for details.

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

Support
-------

[](#support)

If you have any questions or issues, please email  instead of using the issue tracker.

###  Health Score

43

—

FairBetter than 91% of packages

Maintenance64

Regular maintenance activity

Popularity31

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~20 days

Total

2

Last Release

216d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/38b7c34a3bb546140c926613060af92984bc184c8731e1cf9aaea704ca88a685?d=identicon)[hosseinhezami](/maintainers/hosseinhezami)

---

Top Contributors

[![hosseinhezami](https://avatars.githubusercontent.com/u/8210576?v=4)](https://github.com/hosseinhezami "hosseinhezami (3 commits)")

---

Tags

middlewarelaravelsecurityAuthenticationlaravel-packageauthorizationaclpermissionrolesrbacaccess-controlblade-directiveslaravel-permissionslaravel-rolesRole Managementuser-rolespermission-managerpermission-systemrole-based-access-controlpermission-managementuser-permissionsmulti-rolepermission-checkaccess-managementauthorization-system

### Embed Badge

![Health badge](/badges/hosseinhezami-laravel-permission-manager/health.svg)

```
[![Health](https://phpackages.com/badges/hosseinhezami-laravel-permission-manager/health.svg)](https://phpackages.com/packages/hosseinhezami-laravel-permission-manager)
```

###  Alternatives

[bezhansalleh/filament-shield

Filament support for `spatie/laravel-permission`.

2.8k2.9M88](/packages/bezhansalleh-filament-shield)[casbin/laravel-authz

An authorization library that supports access control models like ACL, RBAC, ABAC in Laravel.

324339.9k4](/packages/casbin-laravel-authz)[efficiently/authority-controller

AuthorityController is an PHP authorization library for Laravel 5 which restricts what resources a given user is allowed to access.

15533.2k](/packages/efficiently-authority-controller)[hasinhayder/tyro

Tyro - The ultimate Authentication, Authorization, and Role &amp; Privilege Management solution for Laravel 12 &amp; 13

6712.1k2](/packages/hasinhayder-tyro)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
