Spatie integration is optional. Install
spatie/laravel-permission only if you need RBAC features.Installation
Creating Permissions and Roles
Via Tinker
Via Seeder
database/seeders/PermissionSeeder.php
Protecting Endpoints
Using Middleware
Spatie provides several middleware options:routes/api.php
Using SpatieAuthorize Middleware
Rest Generic Class includes a custom middleware:routes/api.php
- Resolves the required permission from route metadata
- Checks if the user has the permission
- Returns 403 if unauthorized
In Controllers
Check permissions in controller methods:ProductController.php
Permission Management API
Rest Generic Class provides theHasPermissionsController trait for managing permissions via API.
Add Trait to Controller
PermissionController.php
Register Routes
routes/api.php
Assigning Permissions to Roles
Basic Assignment
Modes
ADD Mode
Adds permissions without removing existing ones:[products.view, products.create, products.update]
SYNC Mode
Replaces all permissions with the specified list:[products.view] (others removed)
REVOKE Mode
Removes specified permissions:[products.view, products.update] (create removed)
Assign to Multiple Roles
Using Prefix
Add permissions with a prefix:[products.view, products.create, products.update, products.delete]
By Module
Assign all permissions from a module:By Entity
Assign all CRUD permissions for entities:[products.view, products.create, products.update, products.delete, categories.view, ...]
Assigning Permissions to Users
By User ID
By Email
With Pivot Data
Add extra pivot data (for team-scoped permissions):Field-Level Permissions
Restrict which fields users can modify based on their role.Setup in Model
User.php
How It Works
User witheditor role tries to update:
nameandemailare updated ✅ (base fields, no restriction)is_superuseris ignored ❌ (only superadmin can modify)statusis ignored ❌ (only admin can modify)
Using FilterRequestByRole Middleware
Automatic field filtering:routes/api.php
- Checks user’s roles
- Strips denied fields from request before validation
- Passes clean request to controller
Empty
fieldsByRole means no restrictions (backward compatible).Checking Permissions in Blade/Vue
In Blade Templates
In Vue.js
Pass permissions to frontend:Common Patterns
CRUD Permissions
Standard naming convention:Admin vs User Permissions
Wildcard Permissions
Spatie doesn’t support wildcards, but you can implement them:Troubleshooting
Permission Not Working
Symptom: User with permission still gets 403 Checks:- Clear permission cache:
php artisan permission:cache-reset - Verify guard matches:
'guard_name' => 'api' - Check user has role:
$user->roles - Check role has permission:
$role->permissions
Cache Issues
Symptom: Permission changes don’t take effect Cause: Spatie caches permissions for performance Solution:Wrong Guard
Symptom: “User does not have the right permissions” Cause: Guard mismatch (web vs api) Solution: Ensure consistency:Next Steps
Middleware Reference
Complete middleware documentation
Many-to-Many
Secure pivot table operations with permissions
Testing
Test permission-protected endpoints
Spatie Docs
Official Spatie Laravel Permission docs
Evidence
-
File:
src/Core/Traits/HasPermissionsController.php
Lines: 1-153 (entire file)
Implementsassign_roles()andassign_users()endpoints -
File:
src/Core/Models/BaseModel.php
Lines: 57-138
DefinesfieldsByRoleandgetDeniedFieldsForUser()for field-level permissions -
File:
src/Core/Middleware/SpatieAuthorize.php
Middleware for automatic permission checking -
File:
README.md
Lines: 207-220
Shows permission sync example