scheb/two-factor-bundle
Symfony bundle that adds two-factor authentication to your app with TOTP, email codes, backup codes, trusted devices, and extensible authentication providers. Integrates with Symfony security and supports custom providers and recovery workflows.
Architecture fit. Unchanged and still the dominant finding. scheb/two-factor-bundle is a Symfony bundle, not a Laravel package. It plugs into Symfony's kernel, dependency-injection container, event dispatcher, and security-bundle firewall/auth-provider pipeline. A Laravel application cannot consume it natively: there is no service provider, no config publishing, no facade, and no Laravel guard integration. Wiring it in would require embedding a Symfony security firewall and container inside a Laravel app — an anti-pattern that fights both frameworks' auth lifecycles. For a Laravel/PHP codebase, the architectural fit remains effectively zero. The v4.18.4 patch does not change this in any way.
Integration feasibility. Low-to-none for Laravel. The bundle's value (firewall-based two-factor enforcement, authentication event listeners, trusted-device cookies, backup codes, TOTP/email providers) is tightly coupled to Symfony's Security component contracts. Porting those contracts into Laravel's Auth guards, Authenticatable model, session handling, and middleware stack would still require custom adapters for each extension point — weeks of work to replicate functionality Laravel already offers first-party.
Technical risk. The v4.18.4 release materially corrects one input to the prior assessment, but does not rescue the package.
PUBLIC_ACCESS constant) is evidence of some live maintenance on the 4.x line. That is a meaningful correction — the "abandoned, zero patches, no CVE response" characterization is now too strong and should be retired from the record. However, a single compatibility patch does not constitute a supported release cadence, a security policy, or an SLA.scheb/2fa-bundle / scheb/2fa. The strategic direction of the maintainer ecosystem is unchanged, and the long-term path off this package still exists and still must be walked.Key questions.
laravel/fortify, pragmarx/google2fa, or a hosted IdP (Auth0, Okta, Cognito, WorkOS)? Nothing in this release narrows that gap.scheb/2fa-bundle on Symfony 6.x/7.x?Assessment: do not adopt for Laravel — unchanged. Score (2.565) and Symfony-only architecture remain disqualifying for a Laravel/PHP stack. For legacy Symfony consumers, the risk rating improves from disqualifying to tolerable-as-a-bridge: v4.18.4 is a low-risk, non-breaking patch that buys time, not a destination. Downgrade the "abandoned" language to "minimally maintained on an EOL runtime" and keep the retirement deadline.
Stack fit. Poor for Laravel, unchanged. The package presumes Symfony's framework-bundle, security-bundle, event dispatcher, and DI container. Laravel's container, Auth guards, middleware, and session model are different abstractions. There is no first-class bridge, and building one produces a hybrid runtime that is hard to reason about, test, or upgrade. The v4.18.4 bugfix is internal to Symfony's security constants and has no bearing on Laravel interoperability.
Recommended path (Laravel): use native or well-maintained alternatives rather than this bundle.
laravel/fortify (TOTP + recovery codes) with laravel/breeze/jetstream front ends; laravel/sanctum for API tokens.pragmarx/google2fa + bacon/bacon-qr-code for direct TOTP control.web-auth/webauthn-lib or a hosted provider for a forward-looking factor mix.Migration path (if a legacy Symfony app is the real consumer). The sequencing below is now more actionable, because v4.18.4 removes the Symfony 5.2 PUBLIC_ACCESS blocker that may otherwise have forced a stopgap fork.
scheb/2fa-bundle on a Symfony 6.x/7.x target. Treat step 2 as a bridge, not a destination — do not let "it's patched now" become the reason the migration slips.Scheb\TwoFactorBundle\...), provider interfaces, and event names.Compatibility. Revised: the 4.x line now demonstrably carries Symfony 5.2 compatibility via v4.18.4. Its practical ceiling remains the Symfony 4.4/5.x era, all of which is EOL. Modern Symfony (6.x/7.x) and modern Laravel (10/11/12) remain out of scope for this package. PHP version ceilings on the branch still apply and should be re-verified against the target runtime before committing.
Sequencing (Laravel). Unchanged.
Sequencing (legacy Symfony).
Maintenance. Revised from unacceptable to marginal and time-boxed. The v4.18.4 release demonstrates the 4.x branch is not frozen, so the prior "no patches, ever" framing was overstated. But the maintenance posture remains thin: patch-level compatibility fixes only, no evidence of a published security policy, no CVE-response commitment, and no forward investment — which is rational, since the line is superseded. Every future PHP/Symfony upgrade still risks becoming a manual patch exercise. This stays an open risk item in dependency review, at lower severity than previously recorded.
Support. Community support has effectively wound down; the upstream author directs users to scheb/2fa-bundle. No vendor, no SLA, no named security contact. Internal teams would still own any fork — a costly, low-value commitment for functionality available elsewhere. The single patch does not create a support relationship.
Scaling. The bundle itself is not a scaling bottleneck (TOTP is stateless; trusted devices and backup codes are DB-backed). Real scaling concerns are operational and unchanged: session/cookie handling behind load balancers, shared storage for trusted-device tokens, DB indexes on backup-code lookups, and rate limiting on verification endpoints. These are solvable but must be designed regardless of library. Nothing in v4.18.4 alters the scaling profile.
Failure modes.
Ramp-up. Deceptively low for a Symfony developer, misleading for a Laravel team. A Laravel engineer would still spend more time learning Symfony's security firewall and DI than delivering 2FA. Recommended investment instead: 2–5 days on Fortify TOTP + recovery codes, plus a week on UX, enforcement, audit logging, and rollout. If a legacy Symfony app is in play, budget 1–2 days to apply and regression-test v4.18.4 as a bridge, plus the previously estimated 2–4 engineer-weeks for migration to scheb/2fa-bundle on a supported Symfony version, including data migration and a user re-enrollment window.
Bottom line. v4.18.4 is a low-risk, non-breaking patch that corrects the record on maintenance status — the 4.x line is minimally maintained, not archived — and clears a Symfony 5.2 compatibility blocker. It does not change the recommendation. Treat scheb/two-factor-bundle as a reference for 2FA design and, at most, a short-lived bridge on a legacy Symfony app. For Laravel, adopt Fortify or a managed IdP. For legacy Symfony, apply v4.18.4 to unblock, migrate to scheb/2fa-bundle on a supported version, and hold a hard retirement date for the old bundle — "it got a patch" is not a reason to extend it.
How can I help you explore Laravel packages today?