afurgeri / laravel-rbac
Roles, permissions, and permission middleware for Laravel applications.
Requires
- php: ^8.3
- afurgeri/laravel-crud: ^0.4
- illuminate/database: ^13.0
- illuminate/http: ^13.0
- illuminate/support: ^13.0
Requires (Dev)
- laravel/pint: ^1.29
- orchestra/testbench: ^11.0
- pestphp/pest: ^4.7
- pestphp/pest-plugin-laravel: ^4.1
Suggests
- mongodb/laravel-mongodb: Enable the optional MongoDB RBAC integration test suite and MongoDB-backed roles and permissions.
README
Roles, permissions, role assignment, and permission middleware for Laravel applications. The package depends on afurgeri/laravel-crud for reusable CRUD definitions.
Scope
This package provides the reusable RBAC core:
- SQL and MongoDB role and permission models;
HasRolesandHasPermissionsintegration contracts;- permission middleware;
- configurable RBAC tables and user model;
- migrations and permission seeders;
- role authorization through Laravel policies;
- optional CRUD integration for the
Rolemodel.
Resource-specific user CRUD, Inertia controllers, routes, navigation, and Vue pages belong in the consuming application.
Installation
composer require afurgeri/laravel-rbac
Both the RBAC and CRUD service providers are registered through Laravel package discovery.
After installing both packages, generate the application integration with:
php artisan crud:install php artisan rbac:install --database=mysql
rbac:install generates the user/role CRUD definitions, controllers, policy, routes, and Inertia/Vue pages. It requires the generic CRUD frontend files from crud:install and reports the required User model integration without modifying the model automatically.
For MongoDB, install the official driver in the consuming application and select the MongoDB integration stubs:
composer require mongodb/laravel-mongodb php artisan rbac:install --database=mongodb
The installer generates explicit Role and Permission model configuration for the selected connector. It does not generate or modify the application's authenticatable User model.
If Packagist is temporarily unavailable, add the GitHub repositories as temporary VCS sources:
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/afurgeri/laravel-crud"
},
{
"type": "vcs",
"url": "https://github.com/afurgeri/laravel-rbac"
}
]
}
Then require the tagged versions:
composer require afurgeri/laravel-crud:^0.4 afurgeri/laravel-rbac:^0.3
User model integration
The application's authenticatable model must use HasRoles and implement HasPermissions:
use Illuminate\Foundation\Auth\User as Authenticatable; use Modules\Rbac\Concerns\HasRoles; use Modules\Rbac\Contracts\HasPermissions; class User extends Authenticatable implements HasPermissions { use HasRoles; }
Configure the application user model in config/rbac.php. The installer writes the explicit role and permission classes for its selected connector, but leaves models.user unset because it must point to the consuming application's authenticatable model:
return [ 'models' => [ 'user' => App\Models\User::class, ], 'tables' => [ 'roles' => 'roles', 'permissions' => 'permissions', 'users' => 'users', 'role_user' => 'role_user', 'permission_role' => 'permission_role', ], 'protected_role' => 'admin', ];
Publish the configuration and migrations when they need to be customized:
php artisan vendor:publish --tag=rbac-config php artisan vendor:publish --tag=rbac-migrations php artisan migrate
Permissions
Use hasPermission() in application authorization logic:
if ($user->hasPermission('reports.view')) { // ... }
Protect routes with the registered permission middleware:
Route::get('/reports', ReportController::class) ->middleware('permission:reports.view');
Application-specific permission constants should be declared by the application or a dependent package. The bundled RbacPermissions list contains the permissions used by the companion scaffold.
CRUD integration
Role implements the CRUD definition bridge and can be used with CrudIndexManager, CrudSchemaManager, and CrudMutationManager from afurgeri/laravel-crud.
The package does not provide user CRUD because user fields, password handling, policies, routes, and frontend pages differ between applications.
MongoDB behavior
MongoDB uses MongoRole and MongoPermission with permission_ids, role_ids, and user role_ids arrays instead of SQL pivot tables. The package migration owns only the roles and permissions collections; the consuming application owns its users collection and its indexes.
The MongoDB installer sets storage to mongodb and configures MongoRole::class and MongoPermission::class. Configure the application's MongoDB User model, set models.user, and add an index for its role_ids array when role-based lookups need to scale. The SQL installer instead configures Role::class and Permission::class and uses the configured pivot tables.
MongoDB integration tests are separate from the default SQL suite. From the package repository, install the optional test dependency, enable the MongoDB PHP extension, start MongoDB, and run:
composer require mongodb/laravel-mongodb:^5.8 --dev composer test:mongodb
Service provider behavior
The provider automatically:
- merges the default
rbacconfiguration; - loads RBAC migrations and JSON translations;
- registers the
permissionmiddleware alias; - exposes configuration and migration publish tags.
It does not register web routes or Inertia pages.