liberusoftware/api-access-filament
A Filament admin panel integration for the Liberusoftware API access package, giving you screens to manage API clients, tokens, scopes, and permissions from your existing Filament dashboard without building custom admin tooling.
This is a presentation adapter, not a standalone API system. It wires an existing API-access domain package (token/key issuing, scopes, revocation) into Filament panel UI. Treat it as a thin UI layer you may need to fork rather than a batteries-included product.
composer.json and read require. The adapter is useless without whatever package actually owns API tokens (likely a sibling liberusoftware/api-access or a Sanctum/Passport-backed module). Install and configure that before touching the panel.^ blindly. Pin the exact version you audit:
composer require liberusoftware/api-access-filament:1.x.y
src/ for a class implementing Filament\Contracts\Plugin (typically ApiAccessFilamentPlugin):
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\Liberu\ApiAccessFilament\ApiAccessFilamentPlugin::make(),
]);
}
php artisan vendor:publish --provider="Liberu\ApiAccessFilament\ApiAccessFilamentServiceProvider"
php artisan migrate
php artisan filament:optimize-clear
src/Filament/Resources (the token/key resource and its form schema), and config/ (navigation group, tenancy toggle, model bindings).Bind models to your app's models, not theirs. Adapters usually hardcode a token model. Check for a config key and override it in config/api-access-filament.php so the resource operates on your ApiToken model with your user_id/tenant_id columns. This is the single highest-value customization.
Token issuance: show-once pattern. The plaintext token must be displayed exactly once — typically via a Notification or a modal action after create. Verify the adapter does this; if it renders the token in the table, replace the table column with a masked value and move plaintext to an action modal.
Scoping and tenancy. If you use Filament tenancy, confirm the resource implements getEloquentQuery() with tenant scoping. Pattern:
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->where('tenant_id', Filament::getTenant()?->getKey());
}
Without this, an adapter resource leaks tokens across tenants.
Authorization via policies, not the UI. Register a policy for the token model in your AuthServiceProvider. The adapter's resource should defer to viewAny, create, delete. If it doesn't, add ->authorize() / canDelete() guards on the table actions yourself.
Keep domain logic out of the resource. Wrap issuance/revocation in your own action or service class and call it from the Filament action closure. This keeps the flow testable and lets you swap the adapter out later:
Action::make('revoke')
->requiresConfirmation()
->action(fn (ApiToken $record) => app(RevokeToken::class)->handle($record));
Extend, don't edit vendor. Subclass the resource (class ApiTokenResource extends \Liberu\...\ApiTokenResource) and re-register it in the plugin/config. Override form(), table(), and getNavigationGroup() rather than patching files under vendor/.
Test with Filament's Livewire helpers. livewire(ListApiTokens::class)->assertCanSeeTableRecords(...) and ->callTableAction('revoke', $token) are the fastest way to catch a broken adapter upgrade.
NOASSERTION. Treat this as unlicensed until legal review. Do not ship it into a commercial product without checking the repo's LICENSE file directly — NOASSERTION from composer.json metadata often means the file is missing or non-standard.composer.json for filament/filament: ^3 vs ^4. Installing an adapter built for v3 into a v4 panel produces confusing Method not found errors inside Livewire components, not a clean composer conflict.php artisan vendor:publish --tag=filament-assets and re-check filament:optimize-clear.php artisan filament:optimize-clear — otherwise your overrides appear ignored.Plugin::make()->using(...)-style fluent setter, (4) published views. If only (4) exists, plan on forking.->plugins([...]), confirm the service provider is auto-discovered (php artisan about), check canAccess() on the resource/page, then check the policy. Nine times out of ten it is authorization, not registration.How can I help you explore Laravel packages today?