offline-agency/filament-spid
Filament plugin that adds SPID login to your admin panel, letting Italian users sign in with their digital identity. Configure the SPID providers, map SAML responses to users, and secure Filament access without building the integration yourself.
italia/spid-laravel — the delta is the install/doctor/metadata tooling plus the Filament glue, not the SAML itself.filament-spid.minimum_level, default SpidL2) and refuses logins below it, which is a policy decision product has to make explicitly rather than inherit from a library default (spid-auth.sp_spid_level defaults to SpidL1 and must be raised).filament-spid.store_spid_data and spid_data_attributes let you scope which of the eight SPID attributes persist; defaults preserve "store everything." This is the config a DPO reviews, and it should be settled before first login, not after.auto_create_users now defaults to false: a SPID identity no longer silently creates an account. That is a product-visible funnel change — decide whether SPID is a self-service registration path (opt in) or a login-only path for pre-provisioned citizens.filament-spid:install publishes config/migration/assets, writes .env, edits the panel provider and CSRF exemption, and is idempotent with --dry-run; filament-spid:doctor gives read-only readiness checks with stable JSON and defined exit codes. That collapses a multi-day integration spike into a scripted step, and the JSON output is CI-usable.filament-spid:metadata:validate records document SHA-256, plugin and tool versions, profile and timestamp. Usable as evidence artefacts — but the report itself states HOSTED_VALIDATOR_NOT_RUN and FORMAL_AGID_ACCEPTANCE_NOT_OBTAINED, so it does not substitute for the official hosted validator or AgID sign-off. Plan that as a separate workstream.redirect_after_login, spid_level, providers), relocated ACS endpoint, changed fallback email domain (@spid.local → @spid.invalid), and registerRoutes() now defaults to false. Treat as a migration ticket with a regression pass on existing accounts.filament-spid.panel; plugin resolution returns null outside a SPID panel, so shared layouts are safe.Adopt when:
spid_sp_test. Fits environments that cannot route identity data through a third party.HandleSpidLogin/HandleSpidLogout listeners provision the user, authenticate on the panel guard, check canAccessPanel() and tear down the session, with register_listeners as the opt-out.italia/spid-laravel fork, minimum-stability: beta-style patch enablement in composer.json, and a pinned onelogin/php-saml to get past CVE-2025-66475. This is the single biggest adoption gate — confirm with engineering and security that a forked dependency is acceptable in your supply chain and who owns tracking it.Look elsewhere when:
SpidPlugin::providers() is an allowlist over SPID IdPs, not a general federation layer.For executives (one paragraph): SPID login is a compliance requirement and a trust signal for Italian users, and until now it was a bespoke integration risk each time. Version 1.0.0 is the first stable, SemVer-backed release: it converts the integration into a scripted install with a pre-flight readiness check and a local metadata validator that produces audit evidence — so we can scope SPID as a bounded workstream instead of an open-ended one. It also closes real security gaps by default: a minimum SPID security level is enforced, self-service account creation is off unless we opt in, stored SPID attributes are configurable for data minimisation, and panel access is checked before a session is established. The honest caveats are that it requires PHP 8.3+ and Laravel 12+, it depends on a patched fork of the upstream SPID library to sidestep a known CVE, and its validator explicitly does not replace AgID's hosted validator or formal acceptance — both are separate line items we should fund, not assume away.
For engineering (bullets):
italia/spid-laravel, registerRoutes() now false by default, auto_create_users and the no-email fallback domain (@spid.invalid) both changed.filament-spid:install --panel= --input=setup.json --dry-run --migrate. Pre-validates inputs before any write, never overwrites published files, edits the panel provider and bootstrap/app.php via PHP's tokenizer, and is idempotent. Anything unsafe becomes a listed manual step with exit code 1. Use examples/setup.public.json / setup.private.json as templates.filament-spid:doctor --json --strict. Read-only, no network or writes; checks dependency/advisory floors, the SPID patch (judged by the metadata php-saml actually builds, not PATCHES.txt), panel/guard, user model, gate and fillable columns, SPID columns and unique index, SP identity and level, published assets, HTTPS and session cookie, and the SP key pair (including detection of the example pair shipped by the library). CSRF and CSP report as skip — verify those in a browser test. Exit codes 0/1/2, stable schema_version: wire into CI.filament-spid:metadata:validate --url=|--file= --profile= --report= --json --strict. HTTPS-only, TLS verified, no redirects, size and time bounded; a missing or wrong-version tool, crash, timeout, absent xmlsec1 or unreadable report is exit 2, never a pass. Never uploads. Pair with the spid-validation workflow and tools/spid local lab for regression coverage.HandleSpidLogin/HandleSpidLogout own provisioning, guard authentication, canAccessPanel() enforcement (translated access_denied instead of a 403 with a live SPID session) and logout, including handing the session to IdP single logout. Opt out via filament-spid.register_listeners.spid-auth.sp_spid_level ≥ SpidL2, filament-spid.auto_create_users, filament-spid.panel, filament-spid.store_spid_data/spid_data_attributes, and filament-spid.sp_profile/deployment. Note password maps to RandomPassword so auto_create_users works on stock users tables.main on merge using release:* labels; SECURITY.md and CODE_OF_CONDUCT.md present; Laravel Boost guidelines and an spid-integration skill install on boost:install (dev-time only, not a runtime dependency); docs in docs/ plus an Italian guide, with the README quickstart executed in CI against a fresh app.onelogin/php-saml 4.1.0 CVE-2025-66475 forces the fork, and italia/spid-laravel now owns the ACS endpoint and after_login_url. Track upstream releases so we can return to the mainline package.How can I help you explore Laravel packages today?