cartalyst/sentinel-unique-passwords
A Cartalyst Sentinel extension that enforces unique passwords by tracking password history and blocking reuse of previous passwords. Hooks into Sentinel's user repository to validate passwords during registration and updates.
Architecture fit. This package is only architecturally relevant to applications that already run Cartalyst Sentinel as their authentication layer — it does not integrate with Laravel's default Auth guard, Breeze, Fortify, or Sanctum. Its mechanism is a decorator around Sentinel's hashing routine: when a password is being set or changed, the candidate plaintext is checked against the stored hashes of every other account, and the write is blocked if a match is found. That places the package directly in the synchronous write path of registration and password change — the two hottest, most latency-sensitive auth endpoints. Any assessment must therefore treat it as an auth-path dependency, not a utility library.
Integration feasibility. Technically small: a Composer requirement, a service-provider registration, and Sentinel's existing configuration. The real feasibility question is coupling. The package hooks into Sentinel's internal hashing contract; because Sentinel has its own release cadence and has been largely dormant, the compatibility surface is narrow and undocumented here. There is no evidence in the inputs of a maintained version matrix against Sentinel majors, PHP 8.1+, or Laravel 9/10/11.
Technical risk.
Hash::check, 1,000 users implies roughly 50–100 seconds per registration or password change; 10,000 users makes the endpoint unusable. This is the headline risk and the primary go/no-go criterion.NOASSERTION; Cartalyst historically shipped some addons under commercial terms. This must be cleared by legal before any pilot.Key questions.
Hash::check cost ceiling or timeout we would need to impose, and what happens to registration when it is exceeded?Stack fit. Treat as N/A by default. It is a fit only for a Sentinel host. Do not introduce Sentinel in order to adopt this addon; that inverts the dependency and buys a dead ecosystem for a niche control.
Build vs. buy. Given the inputs, build is the stronger recommendation. The control logic is small and self-contained — intercept the password-set event, iterate other users' active hashes with Hash::check, reject on match. In-house implementation buys: scoping to tenant/active users, a hard cap and circuit breaker around the scan, async or rate-limited execution, metrics and audit logging, the ability to swap in breached-password checking, and immunity to the package's licensing and maintenance posture. The buy case is weak: zero dependents, zero stars, one release in four years, unresolved license.
Migration path (if adopting anyway).
Compatibility and sequencing. Sequence the work after the auth path is otherwise stable. Do not bundle with a Laravel or PHP upgrade, because a failure will be unattributable. Rollback is a Composer revert plus flag disable — cheap, which is the one favorable property here.
Maintenance. You inherit an unmaintained package. There will be no security patches and no compatibility updates for future PHP or Laravel releases. Budget either a fork-and-vendor line item or a planned replacement with an in-house implementation. The 2020 last-release date is the load-bearing fact for this section.
Support. Zero stars and zero dependents means no community, no issue triage velocity, and no fallback maintainer. Escalation path is effectively "we fix it ourselves." For an auth-path component, that is a material operational exposure.
Scaling. The cost curve is the operational story: latency scales linearly with user count and is dominated by hash verification cost. Concretely, plan for a hard cap on table size scanned, a time budget on the check, and a documented fallback (allow the write and log) when the budget is exceeded. Without those, the registration endpoint becomes the app's most fragile surface and a trivial denial-of-service target.
Failure modes to watch.
Ramp-up. Engineering learning cost is negligible — the package is small. The real ramp-up is organizational: building the discipline to ask "what does this actually enforce, on which paths, at what cost, under which license?" before approving an auth-path dependency. Recommend codifying the decision (build vs. buy, scope, cost ceiling, compliance mapping to breached-password vs. cross-user-uniqueness) in an ADR so the next team does not re-litigate or, worse, assume protection that was never wired up.
How can I help you explore Laravel packages today?