smony/filament-user-sessions
Filament plugin that lists every active user session—user, IP, parsed device and browser, last activity—with one-click and bulk revoke to force-logout anyone. Flags logins from new devices. Requires Laravel's database session driver.
Architecture fit. This is a thin read/admin layer over Laravel's native database session store — not a second session system, not a custom guard, not middleware in the request path. The shipped surface is a Filament page, a resource with revoke actions, a stat widget, a policy, a notification contract, and two migrations. For a TPM, that is the most defensible kind of dependency: bounded blast radius, no interception of authentication, and an obvious removal path. The cost is architectural coupling to one persistence choice: the plugin reads the sessions table directly, so SESSION_DRIVER=database is a hard prerequisite. Apps on Redis, file, cookie, or DynamoDB sessions cannot use it without first migrating their session store — an infrastructure change, not a composer require.
Integration feasibility. Genuinely small: require the package, ensure session:table migration exists, run php artisan migrate (also creates session_known_devices), register the plugin in the panel provider, optionally publish config. There is exactly one extension point of substance — ResolvesNewDeviceRecipients — plus the standard Laravel Gate::policy(Session::class, ...) override. A mid-level Laravel developer should land installation plus a restrictive policy in under a day, including staging verification.
Technical risk. Ranked:
remember_me is in use, Laravel's recaller cookie can silently re-authenticate the session. That is not equivalent to Auth::logoutOtherDevices() / AuthenticateSession, which invalidates via password-hash re-check. If this tool is being adopted to satisfy an access-revocation or incident-response control, that distinction must be tested and documented before anyone claims compliance.Key questions. Does revoke invalidate remember-me cookies, or only the current session row? Is the plugin scoped per panel, or does it expose sessions across every guard and panel in the app? What happens with guest/anonymous sessions and multi-guard setups? Is there a retention or pruning policy for session_known_devices, which persists across logout and grows monotonically? Does the notification path fire on every login from a new fingerprint, and can it be rate-limited or routed to a queue? Which Laravel versions are actually in the CI matrix (README specifies Filament v4/v5 but is silent on Laravel)? What is the maintenance commitment from the maintainer — issue response times, security disclosure policy?
Stack fit. Clean, provided you are already on Filament v4/v5 (Laravel 11/12 era) and already on database sessions. If you are on Filament v3, the pinned ^1.0 line means you are adopting a version the maintainer has stopped developing against — a signal to wait until the panel upgrade. If you are on Redis sessions, the honest answer is that this package is not the tool; either migrate session storage (with its own write-amplification and availability trade-offs) or handle sessions through your existing Redis tooling.
Migration path. Two distinct migrations to separate in planning: (1) the session driver change, if needed — this touches env config, the sessions table, and every request's write path, and deserves its own change with its own rollback; (2) the package install itself, which is additive and reversible via composer remove plus dropping session_known_devices. Do not bundle them.
Compatibility. Verify before committing: exact Laravel constraint in composer.json, whether sessions.user_id is populated in your setup (guest sessions and some custom guards leave it null, which degrades the listing), and whether your sessions table name is customized (configurable, but confirm). Check that your panel's navigation and authorization conventions align with a plugin-registered page.
Sequencing. (1) Read the source — it is small. (2) Install in staging against a copy of production's session data. (3) Write and register a restrictive SessionPolicy before the page is reachable by support or non-superadmin roles. (4) Add an activity-log wrapper around revoke actions. (5) Verify revoke behavior with remember_me enabled and with multiple open browsers. (6) Add a monitoring check that distinguishes "page renders with zero sessions" from "page failed to load" so the silent-empty mode gets caught. (7) Roll out to a superadmin-only role, then widen.
Maintenance. Low ongoing code maintenance, non-trivial dependency maintenance. Pin to an exact version, subscribe to releases, and budget a review pass on each Filament major. The upgrade surface is small but so is the maintainer's capacity — the practical risk is abandonment, not churn. Keep the fallback in mind: the core capability (list sessions, delete rows, log the deletion) is a few hundred lines against your own schema, which caps the cost of an exit.
Support. Documentation is above average for a package this size — driver constraints, the authorization override, the fingerprint's limits, and the notification opt-in are all stated plainly, and the release notes flag required migrations and non-breaking changes. What is missing is any support channel: no commercial backing, no SLA, no stated security disclosure process. Treat it as community-supported software in a security-adjacent role.
Scaling. Two tables carry growth. sessions is bounded by Laravel's own lottery-based garbage collection plus your configured lifetime — no new burden. session_known_devices has no built-in retention and grows with users × distinct fingerprints, permanently; add a scheduled prune against your own retention policy (e.g., 180 days) or it becomes an unbounded table nobody owns. Payload parsing on the listing page is per-row work — validate performance at your peak concurrency before enabling for all admins, and confirm pagination exists.
Failure modes. Wrong or changed session driver → empty page, no error, operators conclude no one is logged in. Renamed sessions table without matching config → same. Revoke succeeds visually but the user returns via remember-me → incident responder believes an account is contained when it is not. Package page accessible to a broad admin role → a support-tier admin can log out a superadmin, deliberately or by misclick; bulk revoke makes the blast radius larger. Migration skipped on deploy → fatal error on the sessions page only, so it will surface late.
Ramp-up. A few hours for a developer, minutes for an admin using the UI. The real ramp-up cost is procedural, not technical: teaching responders what "Revoke" actually guarantees, and pairing it with password reset plus logoutOtherDevices() for true containment.
Verdict. Adopt narrowly and conditionally: as an operational convenience for superadmins inside an existing Filament panel already on database sessions, with a policy and an audit wrapper shipped together, and with remember-me behavior verified first. Do not adopt it as the sole mechanism for a compliance-mandated access-revocation control, and do not adopt it if it forces a session-driver migration you would not otherwise make.
How can I help you explore Laravel packages today?