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 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 (or your configured path). Here, you can:
Token Management
createToken() method under the hood.
// Example: Programmatically create a token (optional)
$user = User::find(1);
$token = $user->createToken('API Token Name');
Integration with Filament Resources
public static function getTableRecordsQuery(Table $table): QueryBuilder
{
$user = $table->getUser();
return parent::getTableRecordsQuery($table)
->where('user_id', $user->id)
->when($user->cannot('view-all-tokens'), fn($q) => $q->where('user_id', $user->id));
}
Customizing Token Creation
CreateTokenAction:
use Devtical\FilamentSanctum\Actions\CreateTokenAction;
class CustomCreateTokenAction extends CreateTokenAction
{
protected function handle(): void
{
$token = $this->user->createToken($this->name, $this->abilities);
// Custom logic (e.g., log token creation, send email)
$this->redirect('/admin/sanctum-tokens');
}
}
'create_token_action' => \App\Actions\CustomCreateTokenAction::class,
API Token Authentication in Filament
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
public function store(Request $request)
{
$request->user(); // Authenticated via Sanctum token
Gate::authorize('create', Model::class);
// Proceed with logic
}
Localization and Translations
resources/lang/vendor/filament-sanctum/.Token Abilities vs. Filament Permissions
$token->abilities) are not the same as Filament’s gate policies. Ensure you align them in your AuthServiceProvider:
Gate::define('view-all-tokens', function ($user) {
return $user->hasRole('admin'); // Example: Use a role-based check
});
Token Expiration Handling
config/sanctum.php:
'expiration' => now()->addDays(15),
// app/Console/Commands/RevokeExpiredTokens.php
use Illuminate\Support\Facades\DB;
public function handle()
{
DB::table('personal_access_tokens')
->where('last_used_at', '<=', now()->subDays(15))
->delete();
}
CSRF and Sanctum Conflicts
app/Http/Kernel.php:
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// Sanctum middleware for API routes (if needed)
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
Performance with Large Token Tables
// In a custom resource table
public static function getTableRecordsQuery(Table $table): QueryBuilder
{
return parent::getTableRecordsQuery($table)
->latest()
->paginate(20); // Limit results
}
Token Not Showing in UI?
php artisan tinker
>>> $user = App\Models\User::find(1);
>>> $user->tokens
personal_access_tokens table for orphaned records.Permission Denied Errors
php artisan sanctum:inspect
Plugin Not Loading
php artisan filament:cache-reset
AdminPanelProvider.Custom Token Fields
resources/views/filament-sanctum/...:
<!-- Example: Add a custom column -->
<td>
{{ $record->last_used_at->diffForHumans() }}
</td>
Webhook on Token Creation
sanctum.token-created event in EventServiceProvider:
protected $listen = [
\Devtical\FilamentSanctum\Events\TokenCreated::class => [
\App\Listeners\LogTokenCreation::class,
],
];
Multi-Tenant Support
public static function getTableRecordsQuery(Table $table): QueryBuilder
{
return parent::getTableRecordsQuery($table)
->where('tokens.tenant_id', tenant()->id);
}
How can I help you explore Laravel packages today?