Laravel permission
Skill fusengine/agents/plugins/laravel-expert/skills/laravel-permission
Spatie Laravel Permission - roles, permissions, middleware, Blade directives, teams, wildcards, super-admin, API, testing. Use when implementing RBAC, role-based access control, or user authorization.From its SKILL.md
npx -y skills add fusengine/agents --skill laravel-permissionAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 22 stars22 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
10.3 KB, ~2.4k tokens by cl100k_base, as published. Nobody here has run it
Laravel Permission (Spatie)
Agent Workflow (MANDATORY)
Before ANY implementation, use TeamCreate to spawn 3 agents:
- fuse-ai-pilot:explore-codebase - Check existing auth patterns
- fuse-ai-pilot:research-expert - Verify Spatie Permission docs via Context7
- mcp__context7__query-docs - Check Laravel authorization patterns
After implementation, run fuse-ai-pilot:sniper for validation.
Overview
Spatie Laravel Permission provides complete role-based access control (RBAC) for Laravel applications.
| Component | Purpose |
|---|---|
| Role | Group of permissions (admin, writer) |
| Permission | Single ability (edit articles) |
| Middleware | Route protection |
| Blade Directives | UI authorization |
| Teams | Multi-tenant scoping |
| Wildcards | Hierarchical permissions |
| Super Admin | Bypass all checks |
| Events | Audit logging (v6.15.0+) |
| Query Scopes | Filter users by role/permission |
| API Support | Sanctum/Passport integration |
| Policies | Resource-based authorization |
Critical Rules
- Seed roles/permissions in
DatabaseSeeder - Cache reset after changes:
php artisan permission:cache-reset - Use kebab-case for naming:
edit-articles - Never hardcode role checks in controllers - use middleware
- Set team context early in request for multi-tenant apps
- Specify guard for API -
permission:edit,api - Clear cache in tests - Reset in setUp()/beforeEach()
Reference Guide
Core Concepts
| Topic | Reference | When to consult |
|---|---|---|
| Setup | spatie-permission.md | Installation, model setup, core methods |
| Middleware | middleware.md | Route protection patterns |
| Blade | blade-directives.md | UI authorization directives |
| Direct vs Role | direct-permissions.md | Permission inheritance |
Advanced Features
| Topic | Reference | When to consult |
|---|---|---|
| Teams | teams.md | Multi-tenant permissions |
| Wildcards | wildcard-permissions.md | Hierarchical patterns |
| Super Admin | super-admin.md | Bypass all permissions |
| Custom Models | custom-models.md | UUID, extending models |
Integration
| Topic | Reference | When to consult |
|---|---|---|
| API Usage | api-usage.md | Sanctum, guards, JSON responses |
| Policies | policies.md | Laravel Policy integration |
| Query Scopes | query-scopes.md | User::role(), User::permission() |
| Events | events.md | Audit logging, notifications |
Operations & Quality
| Topic | Reference | When to consult |
|---|---|---|
| Cache | cache.md | Performance, debugging |
| CLI | artisan-commands.md | Artisan commands |
| Testing | testing.md | Tests, factories, setup |
| Performance | performance.md | Optimization, N+1, caching |
Templates (Code Examples)
Setup & Seeding
| Template | Purpose |
|---|---|
| UserModel.php.md | User model with HasRoles trait |
| RoleSeeder.php.md | Basic role seeding |
| PermissionSeeder.php.md | Permission creation seeder |
| WildcardSeeder.php.md | Hierarchical permissions |
Routes & Middleware
| Template | Purpose |
|---|---|
| routes-example.md | Protected routes examples |
| ControllerMiddleware.php.md | Middleware in controllers |
| BladeExamples.blade.md | Blade directive examples |
Teams & Multi-Tenant
| Template | Purpose |
|---|---|
| TeamMiddleware.php.md | Multi-tenant middleware |
| TeamSeeder.php.md | Team-scoped roles seeder |
| TeamModel.php.md | Team model with boot |
Super Admin & Cache
| Template | Purpose |
|---|---|
| SuperAdminSetup.php.md | Gate::before bypass |
| CacheConfig.php.md | Cache configuration |
| DeployScript.sh.md | CI/CD cache management |
API Integration
| Template | Purpose |
|---|---|
| ApiPermissionSetup.php.md | API guard + Sanctum |
| ApiExceptionHandler.php.md | JSON error responses |
| ApiUserResource.php.md | User resource with permissions |
Policies & Events
| Template | Purpose |
|---|---|
| PostPolicy.php.md | Policy with Spatie integration |
| PermissionEventListener.php.md | Audit event listeners |
| UserQueryExamples.php.md | Query scope examples |
| PermissionAudit.php.md | Audit service |
Testing
| Template | Purpose |
|---|---|
| PermissionTest.php.md | Pest & PHPUnit tests |
| UserFactory.php.md | Factory with permission states |
Custom Models
| Template | Purpose |
|---|---|
| CustomRole.php.md | Extended Role model |
| CustomPermission.php.md | Extended Permission model |
| UUIDMigration.php.md | UUID tables migration |
| SetupPermissions.php.md | Custom artisan command |
Quick Reference
Assign Role
$user->assignRole('admin');
Check Permission
$user->can('edit articles');
Middleware (Web)
Route::middleware(['role:admin'])->group(fn () => ...);
Middleware (API)
Route::middleware(['auth:sanctum', 'permission:edit,api'])->group(fn () => ...);
Blade
@role('admin') ... @endrole
@can('edit articles') ... @endcan
Query Scopes
User::role('admin')->get();
User::permission('edit articles')->get();
Teams
setPermissionsTeamId($team->id);
Wildcards
$role->givePermissionTo('articles.*');
Super Admin
Gate::before(fn ($user, $ability) =>
$user->hasRole('Super-Admin') ? true : null
);
Testing
beforeEach(fn () => app(PermissionRegistrar::class)->forgetCachedPermissions());
Feature Matrix
| Feature | Status | Reference |
|---|---|---|
| Basic RBAC | ✅ | spatie-permission.md |
| Middleware | ✅ | middleware.md |
| Blade Directives | ✅ | blade-directives.md |
| Multi-Guard (web/api) | ✅ | middleware.md, api-usage.md |
| Teams (Multi-Tenant) | ✅ | teams.md |
| Wildcard Permissions | ✅ | wildcard-permissions.md |
| Super Admin | ✅ | super-admin.md |
| Cache Management | ✅ | cache.md |
| Direct vs Role Perms | ✅ | direct-permissions.md |
| Artisan Commands | ✅ | artisan-commands.md |
| UUID Support | ✅ | custom-models.md |
| Custom Models | ✅ | custom-models.md |
| Events (v6.15.0+) | ✅ | events.md |
| Query Scopes | ✅ | query-scopes.md |
| Policy Integration | ✅ | policies.md |
| API / Sanctum | ✅ | api-usage.md |
| Testing | ✅ | testing.md |
| Performance | ✅ | performance.md |
Laravel 13 Notes
Spatie Permission 6.24 est compatible Laravel 13. Intégrations L13 :
- Cache prefix hyphens :
spatie.permission.cachedevientspatie-permission-cache; configurerpermission.cache.keysi rétro-compat requise - Attributes Controllers : combiner
#[Authorize](policy) et#[Middleware('role:admin')](RBAC) — voir [[laravel-blade]] - PHP 8.3 :
final readonly classpour Role/Permission DTOs custom
#[Middleware(['auth', 'role:admin|editor'])]
#[Authorize('update', Post::class)]
public function update(UpdatePostRequest $request, Post $post) { /* ... */ }
Best Practices
DO
- Définir une seule source de vérité : Policy OU Permission (pas les deux pour la même action)
- Utiliser
permission:create-post(verb-noun) pour clarté - Activer
teamsuniquement si réel multi-tenant - Cacher les permissions par utilisateur (
Cache::remember('user.permissions.'.$id, ...)) - Super admin via
Gate::before()(jamais via permission wildcard*)
DON'T
- Stocker permissions en session (utiliser le cache Spatie)
- Mixer
hasRole()ethasPermissionTo()sans cohérence d'architecture - Hardcoder noms de rôles dans le code (utiliser enum
RoleEnum) - Oublier de purger le cache après
assignRole()en seeder - Donner
*à un super admin (préférerGate::before()ciblé)
What ships with it: 42 files
176.6 KB alongside SKILL.md
references/
- api-usage.md4.6 KB
- artisan-commands.md3.9 KB
- blade-directives.md3.1 KB
- cache.md3.7 KB
- custom-models.md4.0 KB
- direct-permissions.md4.0 KB
- events.md3.0 KB
- middleware.md3.2 KB
- performance.md4.0 KB
- policies.md3.5 KB
- query-scopes.md3.4 KB
- spatie-permission.md3.9 KB
- super-admin.md3.3 KB
- teams.md3.5 KB
- templates/ApiExceptionHandler.php.md5.8 KB
- templates/ApiPermissionSetup.php.md7.6 KB
- templates/ApiUserResource.php.md5.8 KB
- templates/BladeExamples.blade.md5.3 KB
- templates/CacheConfig.php.md3.8 KB
- templates/ControllerMiddleware.php.md3.2 KB
- templates/CustomPermission.php.md6.5 KB
- templates/CustomRole.php.md5.2 KB
- templates/DeployScript.sh.md3.1 KB
- templates/PermissionAudit.php.md5.7 KB
- templates/PermissionEventListener.php.md4.1 KB
- templates/PermissionSeeder.php.md1.9 KB
- templates/PermissionTest.php.md8.7 KB
- templates/PostPolicy.php.md5.2 KB
- templates/RoleSeeder.php.md2.1 KB
- templates/routes-example.md2.5 KB
- templates/SetupPermissions.php.md4.9 KB
- templates/SuperAdminSetup.php.md3.2 KB
- templates/TeamMiddleware.php.md2.3 KB
- templates/TeamModel.php.md3.8 KB
- templates/TeamSeeder.php.md3.9 KB
- templates/UserFactory.php.md6.0 KB
- templates/UserModel.php.md1.6 KB
- templates/UserQueryExamples.php.md4.7 KB
- templates/UUIDMigration.php.md6.9 KB
- templates/WildcardSeeder.php.md4.9 KB
2 more files not listed here. See all 42 in the repository.