adldap2/adldap2-laravel
Adldap2 Laravel integrates the Adldap2 LDAP library with Laravel, providing authentication plus user and group management through a config-driven API. Use it to connect Laravel applications to Active Directory and OpenLDAP servers for directory queries, search, and login.
Architecture fit
Adldap2-Laravel is a thin Laravel service-provider wrapper around the adldap2/adldap2 core library. It binds an LDAP connection manager into the container, exposes a facade, provides a config file (config/ldap.php) supporting multiple connections and auto-connect, and ships an authentication guard/driver plus a trait for Eloquent models that imports LDAP attributes into a local users table. As a fit for a Laravel application it is idiomatic and low-friction; as a fit for a new build it is a dead end, because the package is archived upstream (last tagged release 2023-02-15, now followed by v6.1.7) and its core dependency adldap2/adldap2 is likewise archived. The author's own guidance is to move to LdapRecord (ldaprecord-laravel), the successor project with a substantially similar API and a documented migration path.
v6.1.7 adds Laravel 10.x compatibility (contributed via laravel-shift, PR #932). This is a compatibility patch, not a resumption of maintenance: no new features, no security process, no roadmap, no active issue triage. It does confirm the package runs on Laravel 10 and, by extension, extends the runway to the next major (Laravel 11) as the likely forcing function. It also demonstrates that the archived repository is soft-archived — a mechanical PR can still be merged — which slightly narrows the "totally abandoned" framing but does not restore ownership, disclosure handling, or CVE response.
Net: good architectural ergonomics, still unacceptable lifecycle posture. Treat this evaluation as "should we keep it, fork it, or replace it," not "should we adopt it."
Integration feasibility
ext-ldap PHP extension and outbound LDAPS (636) or StartTLS reachability to domain controllers; this is a platform/network prerequisite, not a code concern.memberOf, password hashing/modify, account lockout semantics) are where most of the real integration risk sits.Technical risk
| Risk | Severity | Note |
|---|---|---|
| Archived / no security patches | High | Unchanged by v6.1.7. Any CVE in LDAP bind, TLS handling, or auth bypass goes unpatched; you own it |
| Laravel/PHP version drift | Medium (was High) | L10 support lands in v6.1.7; the next illuminate/* conflict almost certainly arrives with Laravel 11. Still a fork-or-migrate decision, just deferred one major |
| Successor divergence | Medium | LdapRecord is actively developed; the longer you wait, the larger the API delta |
| Auth is a critical path | High | Unchanged. An unmaintained auth guard is a tier-0 dependency; failure = nobody logs in |
| "Soft archive" complacency | Medium | A one-off compat PR may reduce perceived urgency to migrate. The absence of a maintained upstream is the risk, not the presence of a recent tag |
| "Dependents: 0" metric | — | Almost certainly a data-quality artifact (Packagist shows real usage); do not treat as evidence of abandonment risk, but do verify before citing |
Secondary risks unchanged: issues/PRs may close, community forks exist but are unvetted, documentation remains online and accurate for the frozen version. v6.1.7 slightly improves the picture — pinning to it is preferable to an older tag — but the dependency-scanning story (abandoned-package warnings) is unchanged.
Key questions
Adldap facade directly rather than an internal interface?Stack fit
Fits any Laravel 6–10 application with PHP 7.3–8.x (L10 requires 8.1++) and ext-ldap. v6.1.7 is the recommended pin if staying on the package; it is the only tag validated against L10. The auth guard drops into config/auth.php alongside existing providers, so it composes with local database auth if you need a hybrid (e.g., LDAP for staff, local for service accounts). The Eloquent sync trait assumes a conventional users table with email/username/objectguid columns; if your schema diverges, expect custom mapping work.
Migration path
Recommend replace, don't adopt. Target LdapRecord-Laravel:
Adldap:: facade calls, guard configuration, model traits, and any raw adldap2 core usage via static analysis/grep. This defines the blast radius.DirectoryProvider interface (authenticate, findUser, syncAttributes, inGroup) — and reimplement the current adapter behind it. This is the single highest-value step and can be done on the archived library.composer.json entirely.If short-term retention is chosen (now more defensible given L10 support in v6.1.7), pin to v6.1.7, fork to an internal namespace, add it to the dependency-review and CVE-watch process, and assign a named owner with an explicit sunset date. Do not let the recent tag be read as evidence that an upgrade path exists beyond L11.
Compatibility
v6.1.7 clears Laravel 10. Verify before any commitment: exact PHP 8.1/8.2 constraints of v6.1.7 versus your target runtime; ext-ldap availability in all deploy targets including CI and containers; LDAP client library behavior with LDAPS and modern TLS; and whether the guard supports Laravel 10's Auth::attempt contract fully (remember-me, session regeneration, password rehash hooks). Note that L11 is not covered by any released tag — treat L11 as the de facto migration deadline.
Sequencing
Seam first, replacement second, removal third. The v6.1.7 patch removes the imminent L10 constraint conflict as a forcing function, so if L10 is your target you will not get a natural trigger — schedule the migration explicitly rather than waiting for the next upgrade to force it. Do not pair a Laravel 11 upgrade with an LDAP provider swap in the same release; if L11 is on the roadmap, the LdapRecord migration should precede it, not follow.
Maintenance
Effectively zero upstream maintenance, but with a caveat new to v6.1.7: the repository is soft-archived — mechanical PRs (compat patches) can still land, while security triage, issue acknowledgement, and roadmap do not exist. Plan accordingly:
composer audit) will flag the abandoned package indefinitely; the v6.1.7 tag does not clear those warnings. Expect either noise or an accepted-risk exception re-justified each cycle.Support
No vendor, no active issue tracker for triage, no SLAs. The v6.1.7 merge shows some responsiveness to mechanical contributions, but that is not a support channel — do not rely on it for a bug you file. Support remains Stack Overflow and archived GitHub issues. Internal team knowledge is the de facto documentation; ensure at least two engineers understand the bind flow and the attribute-sync logic. The LdapRecord docs are the best available substitute reference.
Scaling
LDAP auth is low-throughput relative to typical web traffic, so raw scaling is rarely the constraint. Unchanged from prior assessment:
ldap_control_paged_result) matter on directories with large OUs.Failure modes
Ramp-up
Low for a Laravel developer: published config, facade, guard, and trait are conventional, and the archived docs remain usable. Estimate 1–2 days to productive, 1 week to confident on AD-specific behavior (nested groups, sAMAccountName vs userPrincipalName, DN escaping). The harder ramp is operational, not developer: on-call staff need runbooks for directory outages, TLS failures, and lockout incidents, plus a documented recovery procedure that does not route through LDAP.
Recommendation: Do not adopt. If already present, pin to v6.1.7 (the only L10-validated tag), isolate behind an interface, migrate to LdapRecord-Laravel on a defined calendar trigger — Laravel 11 planning is a natural one — and remove the dependency. If migration is genuinely blocked, treat the fork as a formal, owned, time-boxed risk acceptance, not a silent default, and do not let the v6.1.7 compat patch be read internally as evidence of ongoing upstream support.
How can I help you explore Laravel packages today?