Skip to main content
Rest Generic Class includes built-in integration with Spatie Laravel Permission for role-based access control (RBAC). This guide shows you how to set up permissions, protect endpoints, and manage roles through the API.
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
Run seeder:

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
This middleware:
  1. Resolves the required permission from route metadata
  2. Checks if the user has the permission
  3. Returns 403 if unauthorized

In Controllers

Check permissions in controller methods:
ProductController.php

Permission Management API

Rest Generic Class provides the HasPermissionsController trait for managing permissions via API.

Add Trait to Controller

PermissionController.php

Register Routes

routes/api.php

Assigning Permissions to Roles

Basic Assignment

Response:

Modes

ADD Mode

Adds permissions without removing existing ones:
Result: Editor now has [products.view, products.create, products.update]

SYNC Mode

Replaces all permissions with the specified list:
Result: Editor now has only [products.view] (others removed)

REVOKE Mode

Removes specified permissions:
Result: Editor now has [products.view, products.update] (create removed)

Assign to Multiple Roles

Using Prefix

Add permissions with a prefix:
Expands to: [products.view, products.create, products.update, products.delete]

By Module

Assign all permissions from a module:

By Entity

Assign all CRUD permissions for entities:
Expands to: [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 with editor role tries to update:
Result:
  • name and email are updated ✅ (base fields, no restriction)
  • is_superuser is ignored ❌ (only superadmin can modify)
  • status is ignored ❌ (only admin can modify)

Using FilterRequestByRole Middleware

Automatic field filtering:
routes/api.php
This middleware:
  1. Checks user’s roles
  2. Strips denied fields from request before validation
  3. 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:
Check in Vue:

Common Patterns

CRUD Permissions

Standard naming convention:
Example:

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:
  1. Clear permission cache: php artisan permission:cache-reset
  2. Verify guard matches: 'guard_name' => 'api'
  3. Check user has role: $user->roles
  4. 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)
    Implements assign_roles() and assign_users() endpoints
  • File: src/Core/Models/BaseModel.php
    Lines: 57-138
    Defines fieldsByRole and getDeniedFieldsForUser() 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