evozon-php/simple-bruteforce-bundle
A Symfony bundle that adds simple brute-force protection to your application, tracking failed login attempts and blocking or throttling repeated authentication failures to help defend against credential-guessing and password-spraying attacks.
Architecture fit — Poor. SimpleBruteForceBundle is a Symfony bundle, not a Laravel package, and the distinction is not cosmetic. Its integration surface is Symfony-specific: a Bundle subclass registered in AppKernel, a DI Extension + CompilerPass for service wiring, and event subscribers bound to the Security component's security.authentication.failure / security.authentication.success events. Laravel has no bundle loader, no compiler pass pipeline, and its authentication stack (guards, Attempted/Failed/Login events, middleware pipeline) does not emit Symfony's security events. None of the wiring transfers. What is potentially reusable is the algorithm — attempt counting keyed on identifier, a fixed window, a lockout threshold, and a decay TTL — which is roughly 100 lines of code, not a dependency.
Integration feasibility — Low. Two paths exist and neither is "install the package":
Illuminate\Cache\RateLimiter. Estimated 1–3 engineer-days including tests.RateLimiter facade, throttle: middleware, cache store).Composer-level viability is also weak. A Symfony 3-era bundle will constrain symfony/* to ^2.8|^3.0 and likely php: >=5.5|^7.0. Current Laravel majors resolve Symfony 6/7 components. Forcing resolution with --ignore-platform-reqs to install a security control is an unacceptable trade — it produces an untested runtime combination and an unsupportable lockfile.
Technical risk — High.
Key questions to resolve before any further evaluation:
composer.json constraints on php and symfony/*?X-Forwarded-For trusted?Stack fit — No direct fit. Every component maps onto a Laravel equivalent that we would have to build ourselves:
| Symfony bundle concern | Laravel equivalent |
|---|---|
| Attempt store | Illuminate\Cache\RateLimiter over Redis |
security.authentication.failure subscriber |
Illuminate\Auth\Events\Failed listener or auth middleware |
Bundle Configuration tree |
config/auth.php / dedicated config file |
| Compiler pass wiring | Service provider bindings |
Migration path — None, by design. There is no incremental route from "Symfony 3 bundle" to "Laravel service provider." The realistic path is greenfield: read the bundle's algorithm and its configuration semantics (window length, threshold, decay, key composition), then implement equivalent behavior natively. Treat the repository as a design reference, not a dependency.
Compatibility — Blocking. Symfony 3 component constraints conflict with Laravel 9/10/11's Symfony 6/7 requirements. PHP constraint likely caps below 8.x. Both must be confirmed, but either one alone disqualifies direct installation.
Sequencing, if the capability is in scope:
RateLimiter + a throttle middleware on each surface, keyed on a composite of normalized username and client IP so that neither a single-account nor a single-IP attack slips through.X-Forwarded-For, IPv6 normalization, distributed attempts across nodes, cache flush recovery.Recommendation: do not adopt the package. The build-vs-buy calculus fails on both sides — the buy option is an unmaintained, unvalidated, framework-mismatched dependency, and the build option is a few days against primitives we already own and already patch.
Maintenance — Fork-and-own, with no upstream. Adopting this means permanently owning a vendored security component: PHP 8 upgrades, Symfony-constraint drift, and any future CVE response become our responsibility. That is a real ongoing cost against a 100-line algorithm.
Support — Effectively none. No vendor, no active maintainer, no community. Internal engineers unfamiliar with Symfony bundle idioms would be the only escalation path, which is an avoidable skills tax.
Scaling — This is the sharpest operational risk. Brute-force counters are stateful, and correctness depends on that state being shared and consistent:
Failure modes to design for explicitly:
X-Forwarded-For, the entire IP dimension is bypassable. This requires correct trusted-proxy configuration at the edge, not in application code.Ramp-up — Negative ROI. The team would spend more time learning Symfony 3 bundle conventions and debugging DI wiring than it would spend writing the equivalent Laravel middleware from scratch. Native implementation ramp-up is roughly one sprint-day for an engineer already fluent in Laravel's cache and auth layers.
Net position: the capability is worth having; this package is not the vehicle. The correct disposition is to close the evaluation, capture the bundle's configuration semantics as a reference for policy design, and implement the control natively on RateLimiter with a Redis-backed store.
How can I help you explore Laravel packages today?