Role management with Filament Shield

12-06-2025

Laravel

1.Install Package

composer require bezhansalleh/filament-shield


2. Publish Config

php artisan vendor:publish --tag="filament-shield-config"


3. Add hasRoles traits on User model

use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasFactory, Notifiable, HasRoles;
}


4. Setup Shield

php artisan shield:setup


5. Register FilamentShieldPlugin on app/Providers/Filament/AdminPanelProvider.php

use BezhanSalleh\FilamentShield\FilamentShieldPlugin;

class AdminPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
                    ->plugins([
                        FilamentShieldPlugin::make(),
                    ]);
    }
}


6. Generate Policies for access

php artisan shield:generate --all


Implement on UserResources

1.Generate UserResources

php artisan make:filament-resource User --generate


2. Implement HasShieldPermissions

use BezhanSalleh\FilamentShield\Contracts\HasShieldPermissions;

class UserResource extends Resource implements HasShieldPermissions{
    public static function getPermissionPrefixes(): array
    {
        return [
            'view',
            'view_any',
            'create',
            'update',
            'delete',
            'delete_any',
        ];
    }
}

3. Add form select role
public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\Section::make('Roles & Permissions')
                    ->schema([
                        Forms\Components\Select::make('roles')
                            ->relationship('roles', 'name')
                            ->multiple()
                            ->preload()
                            ->searchable()
                            ->optionsLimit(50)
                            ->helperText('Select roles for this user'),
                    ])
                    ->collapsible(),
            ]);
    }


4. Add role information on table

 public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('roles.name')
                    ->badge()
                    ->separator(',')
                    ->color('success')
                    ->searchable(),
             ]);
    }



notes: run this when create new resources

php artisan shield:generate --all