markup/fallback-password-encoder-bundle
Symfony bundle adding a fallback password encoder so users with legacy or unsupported hashes can still log in. It verifies old credentials and transparently rehashes them with your modern encoder after a successful login, easing migrations without forcing password resets.
What it is: A Symfony bundle that provides a stack of password encoders for authentication — a modern encoder plus one or more legacy encoders — so users with old password hashes can still log in and are transparently rehashed to the modern algorithm on successful authentication. This is a well-established migration pattern (old hash → verify → rehash), packaged as framework plumbing.
Architecture fit: Low for the stack described. Despite the framing, this is a Symfony bundle, not a Laravel package. It relies on Symfony's dependency injection extension and the security component's encoder factory wiring. Laravel has no first-class equivalent "encoder stack" extension point; Hash is driver-based, so adopting this literally is not possible. In Symfony the fit is moderate but competing with native features (see below).
Integration feasibility: Moderate-to-low.
MigratingPasswordHasher / iterable hashers natively; encoders were removed in 6.0. This bundle's viability depends entirely on which API generation it targets. If it predates the hasher API, it is only useful on older Symfony and will break on upgrade.Hasher contract implementation or a manual dual-verify service), not the code.Technical risk: High.
Key questions to answer before any decision:
TPM assessment: Treat this repository as a reference implementation of the pattern, not a runtime dependency. The package bet is unattractive at 0.06 with zero dependents; the idea is worth adopting using native primitives.
Stack fit: Conceptually strong — "verify legacy, upgrade on login" is exactly right for user-table migrations. As a literal dependency it is a poor fit for Laravel and a questionable one for modern Symfony.
Recommended integration (Laravel):
Recommended integration (Symfony): Prefer native MigratingPasswordHasher with an ordered hasher list over this bundle. Only evaluate the bundle if you are pinned to a Symfony version where the native mechanism is unavailable — and even then, vendor/fork it.
Migration path & compatibility:
composer.json constraints against your framework version before anything else.Sequencing (rough effort): inventory (days) → adapters (1 sprint) → chain + rehash-on-login (1 sprint) → canary and monitoring (ongoing) → legacy retirement (single low-risk cleanup). This is a 1–2 sprint effort regardless of whether you use the package, because the audit and adapters are the real work.
Maintenance: Effectively self-owned. Zero dependents and 6 stars mean no upstream support; if you adopt it, budget for a fork, a security review, and periodic manual patching against Symfony releases. The maintenance cost of a small in-house implementation is likely lower than owning an abandoned dependency.
Support: No community, no SLA, no triage. Every question, CVE, and compatibility break routes to your team.
Scaling: Hashing is CPU-bound. The fallback path performs two verifications for every not-yet-migrated user, temporarily roughly doubling auth CPU cost for that cohort. Size login infrastructure accordingly and rate-limit the auth endpoint. Expect a long tail: dormant users only pay the fallback cost when they return, so fallback rate decays slowly and retirement is gated on inactivity windows, not a fixed date.
Failure modes to design against:
Ramp-up: Understanding the pattern is fast (hours). Operating custom authentication code safely requires security-aware engineering, a threat-model review, and monitoring for three signals: fallback rate, auth failure-rate anomalies, and rehash-lag. Plan a named owner for the auth path; this is not a "set and forget" integration.
Bottom line for planning: budget it as a build-the-pattern workstream using native framework primitives, not as a dependency adoption. The 0.06 score and zero dependents make the package itself a net risk to an auth-critical path.
How can I help you explore Laravel packages today?