tomatophp/filament-users
Filament Users gives your Filament admin panel complete user management out of the box: CRUD for users, roles and permissions, profile and password editing, avatar uploads, and auth scaffolding. Install it and start managing users in minutes.
Architecture fit. This is a UI resource layer, not an identity system. It renders Filament pages over your User model and delegates authorization to Laravel policies plus Spatie Permission (ideally via filament-shield). It does not own auth, guards, tenancy, or the identity strategy — those stay with the application. That makes it a clean fit for teams already running Filament 3/4 with a panel provider and a conventional users table, and a poor fit for anyone expecting it to define user management architecture. Customization is designed to happen through subclassing the resource and overriding form(), table(), getEloquentQuery(), and action definitions, which is the right seam for a dependency we don't control.
Integration feasibility. High, with a caveat. The install path is short: pin ^5.0.3, publish config, implement FilamentUser / HasAvatar / HasRoles on User, register the plugin on the panel, write and register a UserPolicy, then wire Shield. Realistic first-version effort is under one developer-day for a Filament-fluent team; hand-building equivalent CRUD (list, create/edit, profile and password fields, role assignment, soft deletes, impersonation) is typically 2–5 developer-days including review. The caveat is that the effort doesn't disappear — it shifts from construction to policy configuration, negative-path testing, and security verification.
Technical risk. The dominant risk is the package's fail-open default: v5.0.3 made password reset, bulk delete, roles, and teams actions policy-aware, but apps with no UserPolicy retain full access by design. Any authenticated panel user who reaches the resource can reset passwords and change roles. That is acceptable only as an explicit, reviewed decision — and it should be treated as a hard adoption gate (≥5.0.3 and a registered policy), not as optional hardening. Secondary risks: impersonation sits outside the v5.0.3 fix and must be gated and audited independently; route/namespace collisions with an existing UserResource are the most common integration failure; guard mismatch between Filament and Spatie produces "role exists but permissions don't work"; and the package is small (91 stars, 0 dependents, single maintainer) with a latest release stamped 2026-09-14, which should be verified for tag provenance before pinning in a regulated context. Low adoption means limited field hardening — assume we are among the more rigorous consumers.
Key questions.
UserPolicy, and is it a release blocker on the adoption checklist?getEloquentQuery() override and tenant assignment on create/edit?UserResource to retire or rename before installing?Stack fit. Laravel + FilamentPHP 3/4 + Spatie Permission, with bezhansalleh/filament-shield for permission generation and stechstudio/filament-impersonate for the impersonation feature. The package expects a conventional users table (name/email/password, plus avatar/status columns where used). Anything unconventional — custom identity providers, non-standard password handling, multi-guard setups — increases integration cost and should be flagged in estimation rather than discovered mid-sprint.
Migration path. Sequence matters more than speed here:
tomatophp/filament-users:^5.0.3, explicitly, not "latest." If any environment ever ran a pre-5.0.3 build, upgrade immediately and audit password-reset and role-change activity.UserResource before the package is discovered, otherwise Filament registers both and you get duplicate navigation entries and route-name conflicts.FilamentUser, HasAvatar, HasRoles) and reconcile config/auth.php, the panel's authGuard(), and config/permission.php.UserPolicy before the resource is exposed — covering viewAny, view, create, update, delete, restore, forceDelete, and impersonation where applicable.shield:install, shield:generate --all, permission:cache-reset) and verify seeded roles resolve correctly under the panel guard.Compatibility. Check Filament major-version compatibility before every bump. Two recurring mismatches: password casting (if User casts password as hashed, do not also call Hash::make() in the form — double-hashing is a silent, hard-to-diagnose failure), and avatar columns (avatar_url vs profile_photo_path), which should be bridged with an accessor rather than a schema change. If User uses SoftDeletes, add restore/forceDelete to the policy and relabel bulk delete so the soft-delete behavior isn't a surprise.
Sequencing recommendation. Land the security floor and policy first, the resource and Shield second, impersonation last as a separately reviewed privileged capability with its own gate and audit. Keep all customization in a subclass pointed to by config; never edit vendor files. Run this on one product before declaring it a portfolio standard — the reusable-baseline argument is plausible but unvalidated until one integration has survived an upgrade cycle.
Maintenance. Single-maintainer, low-adoption dependency — plan accordingly. Pin a minor line, watch GitHub releases, and gate every bump on Filament/Shield compatibility plus a smoke test that logs in as a limited admin and confirms they cannot reset another user's password or escalate roles. Because we subclass rather than fork, composer update stays survivable and we retain a forkable escape hatch. Assign a named owner and a patch SLA; this is the kind of dependency that is invisible until the day it needs a security patch.
Support. The package reduces the support surface for user administration substantially — support staff get browse/search/create/edit, role assignment, and impersonation without a custom build. But the fail-open default means the authorization design, not the UI, determines what support staff can actually do. Define the role model before go-live: who can reset passwords, who can assign roles, who can impersonate. Impersonation in particular needs a dedicated impersonate ability, exclusion of self and super-admins, and an audit record — the package's release notes don't cover it, so verify the gate independently.
Scaling. The resource is a paginated admin surface, so the load profile is modest. The real scaling concerns are data-shape ones: eager-load roles in getEloquentQuery() to avoid N+1 on the user list, scope queries by tenant if tenancy applies (the package has no tenant awareness), keep Spatie permission caches fresh after any role change, and offload large avatar uploads to a queue. Multi-panel deployments should expect per-panel registration and distinct slugs.
Failure modes. The ones worth writing into the runbook:
UserPolicy registered → silent privilege-escalation window. Check Gate::getPolicyFor(User::class) in CI.hasRole() returns false. Fix config alignment, then permission:cache-reset.UserResource → conflicting routes and duplicate nav entries.Ramp-up. For a team already fluent in Filament resources and policies: roughly one day to a working first version, two to three days including policy authorship, Shield setup, and negative-path tests. For a team new to Filament: budget one to two weeks, with most of that spent on panel/guard/permission configuration rather than the resource itself. Treat the training cost as Filament training, not package training — the package is thin, the surrounding conventions are not.
How can I help you explore Laravel packages today?