Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Security Extension Bundle Laravel Package

symfony-bro/security-extension-bundle

A Symfony bundle that extends the Security component with additional authentication and access-control features, helping you configure and customize application security with less boilerplate and more flexible, reusable options.

View on GitHub
Deep Wiki
Context7

Getting Started

First, a framing note: this is a Symfony bundle, not a Laravel package. There is no service provider, no facade, and no config/*.php merge — it will not install into a Laravel app via composer require and "just work." If you are evaluating it from a Laravel codebase, treat it as reference material for how the Symfony Security component is extended, not as a dependency you can drop in.

Steps to actually evaluate it:

  1. Clone and read before requiring. Stars and dependents are zero, so there is no community signal to lean on. Start with README.md, then composer.json (PHP and symfony/* version constraints, autoload PSR-4 map), then the DependencyInjection/ directory — the *Extension class is the real contract for what config keys the bundle accepts.
  2. Register it if you have a Symfony app. Add the bundle class to config/bundles.php, then php bin/console cache:clear and php bin/console debug:config <alias> to see the resolved configuration tree. The alias is defined by getAlias() on the extension class; do not guess it from the package name.
  3. Inspect the service wiring. Look at Resources/config/services.yaml (or services.xml) to understand what is auto-registered, what is tagged (security.voter, kernel.event_subscriber, security.authenticator), and what is conditional on config.
  4. First use case. Given the name, the likely intent is extending the security firewall — custom authenticators, voters, or listeners layered onto security.yaml. The fastest smoke test is a throwaway Symfony 6/7 skeleton app: require the bundle, register it, add the minimum config the README prescribes, and hit a route behind a firewall. If the bundle has no test suite, write that smoke test yourself before trusting it.

If you have no Symfony app, stop here. Porting a bundle into Laravel means standing up the Symfony Security component standalone — symfony/security-bundle drags in HttpKernel, EventDispatcher, and a container. You can wire symfony/security-core (voters, password hashers, user providers) into Laravel's container manually, but you are reimplementing the bundle's glue, at which point the bundle itself is not the thing you want.

Implementation Patterns

Firewall extension. The idiomatic Symfony pattern is to ship an authenticator factory tagged security.authenticator_factory and register it under a firewall in security.yaml. If the bundle does this, your integration is declarative config plus a custom UserProvider or UserBadge loader. Verify the config node name with debug:config rather than copying from blog posts.

Service decoration over replacement. If the bundle registers a listener or voter you want to change, prefer decorates: in your own service definition over redefining the bundle's service ID. Redefining works but breaks silently on bundle upgrades when the ID or constructor changes.

Compiler passes for optional behavior. Well-built bundles gate features behind a compiler pass that checks for the presence of other bundles or tags. Look in the bundle class build() method. If the bundle assumes a dependency is always present, you will get container-compile errors in minimal apps — that is a signal about build quality.

Voter-based authorization. If the bundle provides voters, the integration point is $this->denyAccessUnlessGranted('ATTR', $subject) in controllers and is_granted('ATTR', $subject) in Twig. Confirm the attribute strings — they are usually constants you should reference, not magic strings you retype.

Event subscribers over inheritance. Any hook the bundle exposes as an event subscriber should be consumed that way. Subclassing a bundle service couples you to its internals and is the first thing to break on a minor-version bump.

Testing. Use WebTestCase and loginUser() (Symfony 5.1+) for functional coverage. For unit tests, pull voters and authenticators from the test container and assert vote() / supports() directly. If the bundle ships fixtures or a Test/ namespace, reuse them — an unmaintained bundle with no test helpers usually has no tests at all, which changes your risk calculus.

Laravel-adjacent integration. If the real goal is to reuse Symfony security primitives in Laravel, the workable path is narrow: symfony/security-core for voters and password hashing, resolved through Laravel's container and invoked from middleware or gates. Do not expect the bundle's config tree, firewall listeners, or DI extension to survive that trip — none of that machinery exists in Laravel's container.

Gotchas and Tips

Zero adoption is the headline risk. No stars, no dependents, no issue history means no one has stress-tested this against a real Symfony version matrix. Pin an exact version in composer.json, commit composer.lock, and audit the source before it touches auth code. Security-adjacent code with no users is code you are personally vouching for.

Check maintenance before design. Look at the last commit date in GitLab and the symfony/* constraints in composer.json. If it targets Symfony 4.x or older, it will not install on 6/7 without constraint overrides at best, and will fail at container compile at worst. An abandoned security bundle is a liability, not a shortcut.

Bundle registration is silent when wrong. A missing config/bundles.php entry produces a confusing "service not found" or "config key not recognized" rather than a clear error. After any change: bin/console cache:clear, then debug:config <alias> and debug:container <service_id> to confirm the container actually reflects what you think you configured.

Config quirks hide in the tree. Nested config nodes with canBeEnabled() / canBeDisabled() behave differently from isRequired() nodes — a disabled node may remove services entirely. Read the Configuration class, not the README, for the truth about defaults.

Firewall ordering matters. Symfony security evaluates firewalls in declaration order and stops at the first match. If the bundle's authenticator is on the wrong firewall or behind a broader match, you get 401s that look like auth bugs. debug:firewall (or debug:config security) is the tool.

Debug in dev before prod. Use APP_DEBUG=1 and the profiler's Security panel to see voters, token, and firewall resolution. Prod cache-warming masks container errors until deploy — run bin/console cache:warmup --env=prod locally.

Extension points, in order of preference. (1) Bundle config options, (2) service decoration, (3) a small compiler pass in your own bundle, (4) vendoring a fork. Anything beyond step 2 means you have adopted the maintenance burden the upstream has already abandoned.

License check. Confirm LICENSE exists and the package's license field in composer.json matches. Absent license metadata, you have no granted rights to use it in a commercial codebase — get that resolved before it enters your dependency graph.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console
pnscripts/filament-broadquill-lite
pnscripts/laravel-sentfold-lite
vleap/mx-sdk-laravel-internal
twidpay/utils
htetmyathlaing/scout-elasticsearch-driver
artisan-toolbox/front-awesome
ls/client-assistant
users-au/laravel-client
cgv/localized-resource