devtical/filament-sanctum
Filament Sanctum adds a Filament panel for managing Laravel Sanctum API tokens. Create and view personal access tokens from the admin UI, with publishable config and translations for easy customization.
Installation
composer require devtical/filament-sanctum
php artisan vendor:publish --tag=filament-sanctum-config
php artisan vendor:publish --tag=filament-sanctum-translations
Publish the config and translations to customize behavior, expiration defaults, and language.
Register the Plugin
Add the plugin to your Filament admin panel in app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\Devtical\FilamentSanctum\FilamentSanctumPlugin::make(),
]);
}
First Use Case
Access the Sanctum token management UI at /admin/sanctum-tokens (configurable via sanctum_url in config).
Key features:
authorization config).Token Management with Expiration
// Custom expiration (e.g., 15 days)
$token = $user->createToken('API Token', [], now()->addDays(15));
// Use preset (e.g., 30 days)
$token = $user->createToken('API Token', [], now()->addDays(config('filament-sanctum.default_expiration_days')));
Integration with Filament 5
public static function getTableRecordsQuery(Table $table): QueryBuilder
{
return parent::getTableRecordsQuery($table)
->when(
$table->getUser()->cannot('view-all-tokens'),
fn($q) => $q->where('user_id', $table->getUser()->id)
);
}
'sanctum_url' => 'api-tokens', // Changes path to `/admin/api-tokens`
Customizing Token Creation
CreateTokenAction to add logic (e.g., logging, notifications):
use Devtical\FilamentSanctum\Actions\CreateTokenAction;
class CustomCreateTokenAction extends CreateTokenAction
{
protected function handle(): void
{
$expiration = $this->expiration ?? now()->addDays(config('filament-sanctum.default_expiration_days'));
$token = $this->user->createToken($this->name, $this->abilities, $expiration);
// Custom logic (e.g., send email)
$this->dispatch(new TokenCreated($token));
}
}
config/filament-sanctum.php:
'create_token_action' => \App\Actions\CustomCreateTokenAction::class,
Authorization
// config/filament-sanctum.php
'authorization' => 'view-sanctum-tokens',
Define the gate in AuthServiceProvider:
Gate::define('view-sanctum-tokens', function ($user) {
return $user->hasRole(['admin', 'api-manager']);
});
Localization
// resources/lang/vendor/filament-sanctum/en/messages.php
return [
'expiration' => 'Valid Until',
'never_expires' => 'Never Expires',
];
URL Resolution Issues
/admin/admin/sanctum paths are resolved via Sanctum::getUrl().sanctum_url config key and clear Filament’s cache:
php artisan filament:cache-reset
Token Abilities Display
abilities column uses TextColumn (not TagsColumn):
TextColumn::make('abilities')
->formatStateUsing(fn($state) => implode(', ', $state)),
Expiration Handling
// app/Console/Commands/RevokeExpiredTokens.php
public function handle()
{
DB::table('personal_access_tokens')
->where('expires_at', '<=', now())
->delete();
}
default_expiration_days in config/filament-sanctum.php:
'default_expiration_days' => 30,
Filament 5 Migration
MenuItem is replaced with Action. Update custom plugins:
// Old (v1.0.x)
MenuItem::make('Sanctum Tokens', 'heroicon-o-key')
// New (v1.1.0)
Action::make('sanctum-tokens')
->icon('heroicon-o-key')
->url(fn() => Sanctum::getUrl());
Token Not Showing?
personal_access_tokens table for orphaned records:
php artisan tinker
>>> \Devtical\FilamentSanctum\Facades\Sanctum::getTokensForUser(auth()->user());
view-sanctum-tokens gate.Permission Denied
php artisan gate:test view-sanctum-tokens
AuthServiceProvider.Plugin Not Loading
php artisan filament:cache-reset
php artisan config:clear
Custom Token Fields
php artisan vendor:publish --tag=filament-sanctum-views
resources/views/filament-sanctum/columns/...:
<x-filament-tables::td>
{{ $getRecord()->expires_at?->diffForHumans() ?? __('filament-sanctum::messages.never_expires') }}
</x-filament-tables::td>
Token Events
// app/Providers/EventServiceProvider.php
protected $listen = [
\Devtical\FilamentSanctum\Events\TokenCreated::class => [
\App\Listeners\LogTokenEvent::class,
],
\Devtical\FilamentSanctum\Events\TokenRevoked::class => [
\App\Listeners\NotifyTokenRevocation::class,
],
];
Multi-Tenant Support
public static function getTableRecordsQuery(Table $table): QueryBuilder
{
return parent::getTableRecordsQuery($table)
->where('tokens.tenant_id', tenant()->id);
}
Expiration Presets
config/filament-sanctum.php:
'expiration_presets' => [
'7_days' => __('filament-sanctum::messages.days_7'),
'30_days' => __('filament-sanctum::messages.days_30'),
'custom' => __('filament-sanctum::messages.custom_date'),
],
How can I help you explore Laravel packages today?