lightsaml/symfony-bridge
Symfony bridge for LightSAML that integrates SAML 2.0 service provider authentication with Symfony Security. Provides configuration, firewall integration, and user loading so Symfony apps can add SSO via existing SAML identity providers.
Architecture fit. This bundle is a thin DI/security integration layer over lightsaml/lightsaml, wiring SP and IdP roles into the Symfony container and firewall. For a TPM the relevant framing is that it is not a stand-alone capability — its fitness is entirely derivative of the underlying LightSAML library and of your Symfony major version. The bundle is genuinely differentiated in one respect: LightSAML models both Service Provider and Identity Provider roles, whereas the mainstream maintained alternative (hslavich/oneloginsaml-bundle on onelogin/php-saml) is SP-centric. If the requirement is "our Symfony app must act as an IdP," this is one of very few in-process PHP options; if it is "our app must log users in via corporate Okta/Entra/Azure AD," the architecture fit is poor because better-supported SP paths exist.
Integration feasibility. Low-to-moderate, and dominated by the dependency graph rather than the bundle's own code. Signals: score 4.84/10, 0 dependents on Packagist, prior last release 2018-05-23, opportunity 38.12. Release 1.3.0 is the first publication since then, and its entire changelog is one line: ligthsaml.profile.* profile services made public. That is a container-visibility fix, not a platform-support release — it is what you do to restore $container->get() access and enable service overriding in tests, and it is the kind of change that typically accompanies a Symfony 4+ compatibility complaint. It does not by itself move the PHP-version or Symfony-version constraints, and no dependency bumps or PHP 8 fixes are announced. On Symfony 5/6/7 composer require should still be expected to fail on constraint resolution, and PHP 8 still introduces hard breaks in the SAML stack (removal of libxml_disable_entity_loader, XML canonicalization/signature handling in robrichards/xmlseclibs, dynamic-property deprecations). Assume a fork-and-upgrade, not an install — but the fork is now slightly cheaper.
Technical risk. High, still concentrated in three places, with one modest improvement. (1) Security-critical, thinly maintained code. SAML signature validation and XML parsing are a classic attack surface (signature wrapping, XXE, assertion replay). A single-commit release after seven years of silence is a pulse, not a maintenance program: there is no security policy, no advisory history, and no cadence we can plan platform upgrades against. Because the package is effectively dormant it will not surface in composer audit / roave/security-advisories — a false sense of safety that is worse than a noisy alert. Note the service name still reads ligthsaml (transposed), which suggests the change was made quickly and lightly reviewed; treat it as source material, not as a signal of renewed stewardship. (2) Single-maintainer dormancy of the core library, not just the bridge — 1.3.0 touches the bridge only. (3) Zero dependents means no community forks, no incidental regression coverage, and no one else paying down the PHP 8 upgrade. MIT licensing remains the key mitigating factor: an internal fork is legally and practically clean.
Key questions.
composer.json constraints at all, or only change service visibility? Inspect the diff before assuming any upgrade headroom.Stack fit. Poor on a modern stack out of the box, workable as a vendored fork. The realistic decision tree: on Symfony 4.4/PHP 7.4 with an already-working integration, keep and freeze; on Symfony 5+ or PHP 8+, treat the bundle as source material rather than a dependency. 1.3.0 softens the edge for the "extend, don't replace" path: public profile services make the bundle far easier to decorate, stub in integration tests, and override in a fork, which materially reduces the cost of the Fork option below — but it does not remove the constraint work.
Migration path. Three options, in ascending order of effort:
hslavich/oneloginsaml-bundle (maintained, PHP 8/Symfony 6-7 support) or to SimpleSAMLphp as a sidecar container, leaving Symfony as the application. Both have documented SP-initiated and IdP-initiated flows and current advisory coverage.internal/ namespace: bump constraints, fix PHP 8 incompatibilities, add PHPUnit coverage around signature validation and metadata parsing, and pin with a replace in composer.json so the dormant upstream cannot be pulled transitively. Rebase onto 1.3.0 rather than the 2018 tag — the public-service change saves you one patch and gives tests a supported seam.Compatibility. Assume breakage at the container-compile and firewall-listener layers on Symfony 5+, and at the XML/crypto layer on PHP 8. Verify the transitive set explicitly — robrichards/xmlseclibs, symfony/framework-bundle, symfony/security-bundle, psr/* — since those constraints are what will actually block the upgrade, not the bridge's own code. Make the 1.3.0 diff review an explicit gate: confirm whether composer.json constraints, LightSAML pins, or the compiler pass changed, because the changelog line will not tell you.
Sequencing.
Maintenance. The dominant cost, and it is not amortized — there is no upstream to absorb it. A fork means we own PHP/Symfony upgrades indefinitely, plus the SAML crypto surface. Budget roughly a steady 5–10% of one engineer's time, spiking hard at every PHP or Symfony major. 1.3.0 does not change the arithmetic; if anything it clarifies it, since a seven-year gap followed by a single-line release is the profile of a codebase nobody is systematically maintaining. Add an explicit owner: "the team that touched it last" is not an owner, and an unowned security-sensitive fork is how outages happen. Track a re-evaluation date rather than assuming either abandonment or revival.
Support. Effectively zero external support. Community answers are stale (2018-era), and the vendor-equivalent is whoever on our team last read the code. Contrast with onelogin/php-saml or SimpleSAMLphp, where the maintainers issue security releases and there is an active issue tracker. Also expect composer resolution failures to look like infrastructure problems to on-call and route to the wrong team — document the fork and its ownership in the runbook.
Scaling. The application-level cost is small and predictable: RSA signature verification is sub-millisecond to low-milliseconds per assertion, and SAML exchanges happen at login, not per request. The real scaling constraints are architectural: SP-initiated flows carry per-session state, so any horizontally scaled deployment needs shared session storage (Redis/DB) or sticky sessions; and metadata refresh plus certificate rotation must be automated rather than a manual file drop, or it becomes a recurring after-hours incident.
Failure modes.
composer update across the whole application, delaying security patches elsewhere.ligthsaml.profile.* internals, or the fork/replacement exit gets harder.Ramp-up. Steep relative to value. Effective work here requires SAML domain knowledge (bindings, assertion profiles, signature and canonicalization semantics), Symfony security-firewall internals, and enough crypto literacy to reason about XML-DSig — a rare combination. Documentation is a bundle README, not an integration guide; the working knowledge lives in the code. Public profile services in 1.3.0 shave some of the cost — container access and test seams make the wiring legible and stubbable without editing vendor code — but the protocol and crypto learning curve is unchanged. Realistically, a new engineer needs 2–3 weeks before they can safely modify the integration, and there is no one to ask.
TPM verdict. Shortlist only if the requirement is genuinely IdP-role and a decoupled SimpleSAMLphp deployment has been ruled out; otherwise this is a contained technical-debt item, not an adoption candidate. Release 1.3.0 is a net positive but a narrow one — it improves extensibility and testability for anyone forking, and it removes the "no release since 2018" talking point, without addressing PHP 8, Symfony 5+, dependency currency, or security-response posture. The maintenance cost — not the license or the feature set — remains the deciding factor.
How can I help you explore Laravel packages today?