smartassert/users-security-bundle
Symfony bundle for adding user security to your application, offering a foundation for authentication, user management, and related security services. It provides reusable components and integration points to implement protected user flows with less boilerplate and configuration.
Architecture fit. Release 12.0 confirms the core finding rather than changing it: this is a Symfony bundle, and its trajectory is deeper Symfony coupling, not broader portability. The sole change in the release is a constraint bump to Symfony 8.0 — no framework-agnostic refactor, no documented non-Symfony consumption path, no Laravel-facing work of any kind. The reusable asset for a Laravel target remains the underlying smartassert/user-security domain library, not this wrapper. Treat the evaluation as two separate decisions: adopt the domain library (still plausible) versus adopt the bundle (only if the target is Symfony 8).
Integration feasibility. Unchanged in shape, but narrower in the Symfony scenario. The plain-Composer path — pull the domain package, write thin Laravel adapters (Eloquent user lookup, hasher implementation, custom guard, token middleware) — is now the only viable route for a Laravel consumer, and 12.0 offers no evidence the maintainer intends to make the bundle itself consumable outside Symfony. On the Symfony side, integration remains routine for anyone on Symfony 8: register in bundles.php, configure under config/packages/, wire the user provider into security.yaml. The bundle wrapper should still be assumed non-portable until proven otherwise; this release is a data point against, not for.
Technical risk. Still high, with one risk retired and two sharpened.
Key questions to resolve before commitment.
symfony/framework-bundle 8.0 specifically, or does the underlying smartassert/* domain package also require 8.4? The latter would kill the Laravel adapter path for anyone below PHP 8.4.composer.json require symfony/framework-bundle, or only decoupled symfony/* components?UserInterface, PasswordAuthenticatedUserInterface, event dispatchers)?password_* functions?Stack fit. Assume PHP 8.x, PSR-4 autoloading, and PSR-11 containers on both sides. Laravel can consume the domain library directly; it cannot consume Symfony DI service definitions without loading the Symfony container, which is not a trade worth making — and 12.0 makes that container heavier, not lighter. The integration unit stays a small first-party adapter package, versioned internally, exposing a stable interface to the rest of the application.
Compatibility verification. This release materially advances this step: the Symfony 8 constraint is now known, and the PHP 8.4 floor should be treated as the working assumption until composer.json is read. Verify explicitly whether the domain package — installable independently of the bundle — carries the same PHP 8.4 requirement. It very likely does not, but if the smartassert family was bumped in lockstep, the Laravel path collapses for teams on PHP 8.2/8.3 (Laravel 10, and Laravel 11/12 installations still on older runtimes). Laravel-version support is still unclaimed anywhere; that remains an assumption to validate by execution.
Migration path. Substantively unchanged, with one addition. Keep the library's domain objects at the boundary and map them to Eloquent models rather than letting them leak into controllers, policies, and Blade views: an Eloquent repository implementing the library's user-lookup interface; a password hasher adapter delegating to Laravel's Hash facade or wrapping the library's hasher with rehash-on-login; a custom guard or Auth::viaRequest for token flows; middleware for transport-level checks. Run the adapter in parallel behind a feature flag during migration and compare authentication outcomes before cutover — hash-format mismatches surface as failed logins, not exceptions. Added for 12.0: pin the domain package to an exact version in the adapter's composer.json. A maintainer who moves to a framework major within days of its release will move again; an exact pin plus a scheduled review is the only cheap defence.
Sequencing.
composer.json on both the bundle and the domain package; a few hours beats a week of guessing.Maintenance. You still own the adapter and, in practice, likely the fork — and 12.0 demonstrates the specific mechanism by which that becomes necessary. A maintainer who adopts a brand-new framework major immediately will, by the same instinct, drop older branches on a schedule you do not control. With no dependents, no external pressure forces compatibility with your PHP or framework version; that work lands on your team. Budget recurring effort for PHP minors, Symfony/Laravel majors, and periodic security review of the auth path. Fork or vendor early, and consider pinning to the last release whose constraints match your runtime rather than chasing the newest tag.
Support. Still no community corpus: no Stack Overflow history, no tutorials, no advisory feed you would reliably notice. The fast major-version turnover reduces the chance that any public discussion matches your version. Support is the maintainer's direct replies plus your team's reading of the source. Confirm responsiveness on the 11.x branch specifically if you are pinned there — abandoned old branches are a worse failure mode than an abandoned project, because the code still installs.
Scaling. Unchanged: authentication is rarely the throughput bottleneck; hashing cost is the meaningful knob and should be a configuration value you control, not a library default. Token issuance and lookup patterns matter more than the package — verify no per-request full-table scans or in-memory user stores that break under horizontal scaling. Session and token state must live in shared storage across instances. One addition: if you are forced onto a newer PHP to satisfy upstream constraints, validate hashing performance on the new runtime before cutover, since password_* cost calibration is runtime-sensitive.
Failure modes to design against.
Ramp-up. The API surface is small, so a competent PHP engineer can be productive in days; the cost is that there are no docs, so onboarding means reading source. Estimate a two-to-three day spike and one to two weeks to production hardening including the adapter, tests, and the fork/vendor contingency — plus a standing half-day per upstream major release for constraint triage. For a team without spare capacity to own an auth adapter, the correct recommendation is unchanged and now firmer: decline and use the first-party Laravel stack. The opportunity score remains high because the niche is uncrowded, not because demand or maturity has been demonstrated — and release 12.0 confirms the package is being built for its maintainer's Symfony-8 roadmap, not for general adoption.
How can I help you explore Laravel packages today?