Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

enadabuzaid's avatar

Spatie Roles Permissions Plugin Is Support Module Structure ?

Hello, I want to ask how to use Spatie Roles Permissions for Filament. with Module Structure !?

0 likes
1 reply
LaryAI's avatar
Level 58

Certainly! Here’s a step-by-step solution for using the Spatie Roles & Permissions package with Filament in a modular (module) structure, such as one created with packages like nWidart/laravel-modules.


1. Install The Spatie and Filament Packages

If you haven't already:

composer require spatie/laravel-permission
composer require filament/filament

2. Publish and Configure Spatie

Run the following:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate

3. Load Config from Proper Module

If your roles/permissions configuration lives in a module (e.g. a module called Admin), ensure the published config (config/permission.php) matches the models in your module, e.g.:

'models' => [
    'role' => Modules\Admin\Entities\Role::class,
    'permission' => Modules\Admin\Entities\Permission::class,
],

And be sure your models in the module use the appropriate Spatie traits.


4. Register ServiceProvider (If Needed)

If you're overriding routes, models or configs in your module, you may need to use your module's ServiceProvider to:

  • Publish/make your own migrations (and run them)
  • Publish your own config and merge it

Example in your module's ModuleServiceProvider:

$this->mergeConfigFrom(__DIR__ . '/../Config/permission.php', 'permission');

5. Use Traits in Module's Models

Your module's User.php, Role.php, and Permission.php should use Spatie traits:

Example (Modules/Admin/Entities/User.php):

use Spatie\Permission\Traits\HasRoles;

class User extends Model
{
    use HasRoles;
    // ...
}

Example (Modules/Admin/Entities/Role.php):

use Spatie\Permission\Models\Role as SpatieRole;

class Role extends SpatieRole
{
    // Optionally extend or override
}

6. Use with Filament

Create Filament Resources for users, roles, and permissions within the module structure, referencing your module models.

Example:

namespace Modules\Admin\Filament\Resources;

use Filament\Resources\Resource;
use Modules\Admin\Entities\Role;

class RoleResource extends Resource
{
    protected static string $model = Role::class;
    // define forms, tables, etc.
}

7. Middleware in Modules

Ensure your module's routes use the correct middleware. Example:

Route::middleware(['web', 'auth', 'role:admin'])
    ->prefix('admin')
    ->group(function () {
        // Module routes here
    });

8. Filament Auth / Policies

Filament respects Laravel's policies. You can use Spatie's permissions directly:

public function can(string $permission): bool
{
    return auth()->user()?->can($permission);
}

Or, use Filament's built-in authorization features referencing your module's permissions.


Summary:
Yes, Spatie Laravel Permission supports module structures. Just ensure:

  • Your module models use Spatie's traits
  • The config references your module's Role/Permission models
  • Your Filament resources use those models
  • Service provider in your module merges/overrides the config if needed

Let me know if you need a working example repo or a more detailed code sample!

Please or to participate in this conversation.