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.
Role, Permission, User) via traits (HasRoles, HasPermissions), enabling domain-specific adaptations (e.g., team-based permissions, hierarchical roles).RoleAssigned, PermissionRevoked) for reactive workflows (e.g., logging, notifications, or caching invalidation).edit-*), reducing boilerplate for CRUD-like operations.6.x branch). Low risk for new Laravel projects.RoleOrPermissionMiddleware for route-level access control, reducing custom policy boilerplate.| Risk Area | Severity | Mitigation |
|---|---|---|
| Migration Complexity | Medium | Requires database migrations for roles, permissions, and pivot tables. Use spatie/laravel-permission:migrate Artisan command. |
| Performance at Scale | Low | Optimized for N+1 queries (e.g., loadMissingPermissions). Cache permissions with spatie/laravel-caching. |
| Concurrency Issues | Low | Fixed TOCTOU race conditions in v6.22.0 for Octane/Horizon environments. |
| Version Lock-in | Low | MIT license + backward-compatible upgrades. Avoid major version jumps (e.g., 6.x → 7.x) without testing. |
| Custom Logic Overhead | Medium | Extend traits (e.g., HasRoles) or override methods (e.g., syncPermissions). Document customizations. |
spatie/laravel-team integration)?loadMissingPermissions and consider caching.spatie/laravel-activitylog or custom observers.@can) and API responses (e.g., user()->getAllPermissions()).HasRoles/HasPermissions traits.| Step | Action | Tools/Commands |
|---|---|---|
| 1. Pre-Integration | Review existing auth logic (policies, gates). Identify conflicts or redundant permissions. | php artisan make:policy (if needed) |
| 2. Installation | Add package via Composer and publish config/migrations. | composer require spatie/laravel-permission |
| Run migrations. | php artisan migrate |
|
| 3. Model Setup | Apply HasRoles/HasPermissions traits to User model. |
php artisan make:model Role -m |
| 4. Seed Initial Permissions | Create roles/permissions via seeder or Tinker. | php artisan tinker |
| 5. Middleware Integration | Protect routes with RoleOrPermissionMiddleware. |
Route::middleware(['role:admin'])->group(...) |
| 6. Frontend Integration | Use @can Blade directives or API checks (user()->can('permission')). |
Custom JS logic (e.g., axios.get('/user/permissions')) |
| 7. Testing | Write unit/feature tests for permission logic. | Pest/PHPUnit |
6.x branch.6.x for PHP 8.2..env).spatie/laravel-permission:install Artisan command for guided setup.User and custom models (e.g., Team).HasRoles/HasPermissions methods thoroughly.RoleOrPermissionMiddleware.PERMISSION_CACHE_ENABLED=true)..env.spatie/laravel-permission:debug Artisan command to inspect user roles/permissions.Gate::inspect().loadMissingPermissions() or caching.spatie/laravel-permission:debug.model_id and permission_name columns are indexed.syncRoles()/syncPermissions() for bulk updates.| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Migration Failure | Downtime if not zero-downtime. | Use Laravel Forge/Envoyer for blue-green deployments. |
| Permission Cache Stale | Users see outdated permissions. | Set PERMISSION_CACHE_TTL to |
How can I help you explore Laravel packages today?