spatie/laravel-permission
Database-backed roles and permissions for Laravel. Assign roles and permissions to users, sync them to the Gate, and check abilities with Laravel’s built-in can()/authorize features. Includes migrations, caching, teams, and flexible model setup.
can() method, reducing friction for developers already familiar with Laravel’s authorization patterns.RoleAssigned, PermissionRevoked) for auditing, logging, or triggering side effects (e.g., Slack notifications). This enables observability and integration with other systems.edit-*), which is useful for broad access control (e.g., "edit all resources in a namespace") while maintaining granularity.HasRoles, HasPermissions traits).PermissionResource, RoleResource).permission:create-role).roles, permissions, and model_has_permissions/model_has_roles tables.spatie/laravel-caching).roles, permissions, model_has_permissions, model_has_roles). For existing applications, this may require downtime or a phased migration strategy.can() method triggers a query per permission check by default. Mitigated by:
with(['roles', 'permissions'])).Gate::before() hooks for bulk checks.edit-*) add complexity to permission resolution. Test thoroughly in production-like environments.syncPermissions) are opinionated. Extending core behavior may require overriding traits or writing decorators.spatie/laravel-permission?RoleAssigned) be logged?Spatie\Permission\PermissionServiceProvider.Gate, Permission, and Role facades for fluent syntax.permission:create-role).Role, Permission) with polymorphic relationships to user models.permission.table_names).RoleResource).RoleOrPermissionMiddleware) for route-based access control.actingAs() with permissions).composer require spatie/laravel-permission.php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider".php artisan migrate (creates roles, permissions, and pivot tables).Role::create() and Permission::create()).spatie/laravel-permission methods (e.g., $user->givePermissionTo('edit')).Gate::define('edit', fn($user) => $user->can('edit'))).RoleOrPermissionMiddleware (e.g., auth:admin → role:admin).assertTrue($user->can('edit'))).PermissionDoesNotExistException).Permission models). Use the package’s config to override table/column names.laravel-activitylog) if used.HasRoles/HasPermissions traits:
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable {
How can I help you explore Laravel packages today?