eightynine/filament-password-expiry
Filament plugin that enforces password expiry in your Laravel admin panel. Define a maximum password age, prompt users to update expired passwords after a set number of days, and redirect them to a secure change-password screen.
Architecture fit. The package targets the Filament v3/v4 plugin surface for Laravel — a service provider plus a Plugin contract implementation, with enforcement typically delivered through middleware and/or an authenticated-panel hook that inspects the age of the user's current password. That aligns cleanly with Laravel's existing credential lifecycle (Fortify/Breeze/Jetstream all write password changes through the same model events), so the integration point is well understood and low-surface. The concern is not architectural: it is that the package encodes a policy — forced periodic rotation — that NIST SP 800-63B and NCSC guidance explicitly discourage absent evidence of compromise. Architecture fit is high; product fit is conditional on a compliance driver, not a security-best-practice driver.
Integration feasibility. Low-to-moderate effort. Expected work: publish config, add a password_changed_at (or configurable equivalent) column and backfill it, register the plugin on each relevant panel provider, and confirm middleware ordering relative to Filament's Authenticate stack. Multi-panel installs (admin + customer) each need explicit registration, which is easy to miss.
Technical risk.
Key questions for the vendor/author.
updated_at, or configurable resolver? Is a null/legacy value treated as expired or as fresh?Stack fit. Native to the TALL stack: Laravel + Livewire + Filament. No new infrastructure, no external service, no queue dependency required for core enforcement. This is the package's strongest attribute — it introduces zero new runtime components.
Migration path.
Compatibility checks. Filament v3 vs v4 is the primary axis — verify the constraint in composer.json matches your installed major before scoping. Confirm interaction with your auth stack (Fortify/Breeze/Jetstream), any existing password-reset customization, and any custom Filament login flow. Verify behavior in queue workers, console commands, and API routes, where panel middleware should not apply but sometimes does.
Sequencing. Do policy decision → stakeholder sign-off (security/compliance + a communication plan) → migration and backfill → warn-only rollout → enforced rollout. The engineering work is a few days; the change-management and user-communication work is the real critical path. Do not run the migration and enforcement in the same release.
Maintenance. Small code footprint, but a single-maintainer dependency with no dependents to surface breakage early. Budget for periodic review at each Filament major release, and treat the plugin as pinned-with-review rather than freely upgradable. Because the package is thin, an in-house fallback (a middleware plus a model column) is a realistic exit ramp if maintenance lapses — that caps the long-term risk meaningfully.
Support. Expect a durable trickle of tickets: users surprised by expiry, users who cannot change their password (SSO, shared accounts, locked-down service identities), and password-policy conflicts between the reset page and your existing validation rules. None of these are package defects, but they are the package's operational cost. Establish a support macro and a documented exemption process before enforcement goes live.
Scaling. Effectively free. One indexed column read per authenticated request, negligible at any realistic panel concurrency. No background jobs required unless pre-expiry notifications are enabled, in which case a scheduled command and mail throughput become relevant.
Failure modes to design around.
Ramp-up. An hour for a Laravel-fluent engineer to read the source and wire it up; half a day including migration, backfill, and panel registration. The genuinely time-consuming work is the policy decision, the compliance justification, the exemption model, and user communications — none of which the package addresses, and all of which determine whether the rollout succeeds or produces a backlash.
TPM verdict. Technically low-risk and cheap to adopt, but adoption should be driven by a named compliance obligation rather than a security-improvement narrative, and it should be gated behind an admin exemption plus a phased, communicated rollout. The 0-star/0-dependent signal is acceptable only because the package is thin enough to replace in-house on short notice.
How can I help you explore Laravel packages today?