bbs-lab/filament-password-rotation
A Filament plugin for Laravel that adds configurable password rotation policies. Enforce password expiration, track password history, and prompt users to update credentials at login or within Filament panels, helping teams meet security requirements without custom code.
Package context. BBS-Lab/filament-password-rotation is a Filament plugin that adds forced password rotation/expiry flows to a Laravel admin panel (notably a forced-change form with current-password/new-password autocomplete tokens). It is a presentation-layer concern bound to the Filament version line in use, not a general-purpose auth library.
Architecture fit. Fits a Laravel + Filament stack where the panel is the primary admin surface and password policy needs to be enforced at the UI layer. It does not replace laravel/fortify, breeze, or custom password-expiry middleware — treat it as the UX front-end to a policy you still own server-side. If the team's auth flows live outside Filament (public-facing login, API tokens, SSO), this package covers only a slice of the estate and should not be positioned as the password-policy solution.
Integration feasibility. Low for the plugin itself: standard Composer install, Filament plugin registration, published config/migrations as applicable. The v2.1.3 change is CSS/markup-level on the forced-change form — no migrations, no API surface change, no config keys. Feasibility risk is concentrated in discovery (does our policy model map to the plugin's expiry semantics?) rather than in wiring.
Technical risk.
composer.lock with an exact reference until we have confidence in the release process. Worth a direct question to the maintainer about whether tags are immutable going forward and whether the v2.1.2 tag was deleted/retagged.username anchor plus the existing current-password/new-password tokens is a known, well-understood pattern for defeating Chrome's saved-password autofill and strong-password generator. Blast radius is limited to one form.->revealable(), so no bespoke JS is inherited — good for maintenance, but it also means the behaviour is coupled to Filament's component contract and can shift between Filament minor versions.Key questions.
password_changed_at column, or the plugin's own logic? What happens if a user bypasses the panel (API, CLI)?Stack fit. Requires Laravel (target version to be confirmed against the package's composer.json) and a Filament panel at a matching major. Confirm the panel's Filament version first; the whole integration is gated on that single constraint. If the panel is on Filament v3 and the package only ships v4 support (or vice versa), this is a non-starter without a fork.
Migration path. Greenfield adoption is a single Composer require plus plugin registration in the panel provider, then configuring expiry thresholds and the forced-change redirect. For panels with an existing custom forced-reset flow, migrate by routing users through the plugin's page behind a feature flag, keeping the legacy flow reachable until a full rotation cycle (the longest expiry window) has elapsed — that is the only way to observe the edge cases (expired-at-login, expired-mid-session, expired-during-impersonation).
Compatibility. v2.1.3 is explicitly backward compatible with v2.x, and the change is confined to markup on one form. Treat it as safe to take within the 2.1 line. Pin to 2.1.3 exactly (or a ~2.1.3 constraint) rather than floating ^2.0, specifically because of the v2.1.2 publish incident — a floating constraint could have landed on the mis-pointed tag. Cross-browser verification matrix at minimum: Chrome (the fix's target), Firefox, Safari, Edge, plus one third-party password manager.
Sequencing.
composer show bbs-lab/filament-password-rotation, compare commit against upstream tag; remediate any v2.1.2 exposure.Maintenance. Near-zero ongoing cost at runtime — no new services, no jobs, no storage. The real maintenance load is dependency-tracking: this package must be bumped in lockstep with Filament majors, and Filament's release cadence is the pacing item. Budget a small recurring review (each Filament upgrade) rather than continuous effort. The v2.1.2 incident adds one-off cost: an audit of what we actually shipped and a decision record on pinning policy.
Support. Failure surface is narrow and user-visible rather than systemic: users unable to complete the forced-change form, or password managers behaving unexpectedly. Support scripts should cover "password field not accepting input / autofill overwriting" explicitly, since that is the exact class of bug this release fixes and it will recur as browsers change heuristics. Escalation path to the maintainer is GitHub issues only — no vendor SLA — so internal ownership must be named.
Scaling. Negligible technical scaling concern; the plugin adds one page render per affected user. The scaling question is policy scaling: if the org later wants per-role expiry, breach-list checking, MFA step-up, or SSO-adjacent flows, this package likely will not cover it and a richer policy layer (or in-house implementation) becomes necessary. Plan for that boundary rather than assuming extensibility.
Failure modes.
Ramp-up. Effectively nil for a Laravel/Filament-fluent engineer: plugin registration plus config. The genuine ramp-up is domain knowledge, not code — understanding where the expiry policy is enforced across all auth entry points, which is a half-day of reading, not training. New team members need only know that the forced-change page is a dependency, not bespoke code, and where the browser-quirk history lives.
Recommendation. Adopt v2.1.3 within the existing 2.1 line, pinned exactly, after confirming we have no residual v2.1.2 exposure. Treat the package as a contained UX dependency rather than a password-policy platform, and keep a low-cost in-house fallback in mind pending the maintainer's answers on tag immutability and Filament-major support.
How can I help you explore Laravel packages today?