orchestra/auth
Orchestra Auth is an authentication extension for the Orchestra Platform, built on Laravel's native auth system. It provides user login, registration, password management, and access control scaffolding to secure your Orchestra-powered applications.
Architecture fit — a platform decision, not a package decision. orchestra/auth is the auth component of the Orchestra Platform. It extends Laravel's native guards and providers with Orchestra-aware behavior rather than replacing them, which means the fit question is binary and it is answered before this package is evaluated on its merits. On Orchestra: it is the sanctioned layer for users, roles, and ACL, and introducing a mainstream RBAC package alongside it would create a second auth paradigm — a net negative. Off Orchestra: it degrades to a thin wrapper over Laravel auth plus a set of shipped migrations and models, and adopting it means adopting Orchestra conventions without the platform that justifies them. The TPM framing to hold the team to is "are we an Orchestra shop?" — the auth package follows from that answer rather than driving it.
Integration feasibility — low at the call site, higher everywhere else. Installation is a Composer require with auto-discovered service provider; the integration seam is config/auth.php (guards, providers, and the model the eloquent provider points at) plus the package's published config for table names. Because call sites stay auth()->user(), @auth, ->middleware('auth'), existing team knowledge transfers and the codebase does not become Orchestra-shaped. The stickiness is in the platform dependency, the published migrations, and model extension via providers.users.model — not in controllers. That is a favorable lock-in profile for a security-critical component, and it is the strongest technical argument in the package's favor.
Technical risk — concentrated in unvalidated security paths and absent external evidence. Zero dependents and a 0.3 score mean no third-party bug reports, no Stack Overflow corpus, no upgrade write-ups, and therefore no external validation on a login path. The documented claim that the package "integrates with Laravel's native auth services" is not the same as documented non-deviation in password resets, email verification, remember-me, or session invalidation — and those are exactly the paths where a wrapper's behavior diverges quietly. Secondary risks are well-understood and cheap to contain: the v5.0.1 rollback exception (a config() → Config facade fix surfacing only from a testing environment), config caching silently ignoring .env changes to guards/providers/table names, and foreign-key ordering breaking rollback when custom tables are added around the auth schema. The structural risk is the Orchestra upgrade treadmill: Orchestra majors force auth majors, and an auth upgrade is never a routine composer update.
Key questions to resolve before commitment:
Stack fit. Laravel/PHP inside Orchestra. If the team already writes Laravel auth idiomatically, ramp at the call site is close to zero; the cost is entirely in learning the internals, for which there is no documentation corpus.
Migration path — three routes, funded differently.
^5.0.1, add the rollback CI job, close it.composer require. Standing up Orchestra to justify this package is a platform project wearing a dependency's clothes. Either fund it as such or take Laravel native auth plus a mainstream permissions package.Compatibility. Pin ^5.0.1. Verify facade availability under config caching and console bootstrapping before promoting beyond CI, and validate on an image that boots with config:cache enabled rather than only under php artisan serve. Diff any locally forked migrations against the vendored source.
Sequencing (each step gates the next):
^5.0.1; register the provider manually if dont-discover is set.vendor:publish → migrate → migrate:rollback → migrate. This is the exact regression class v5.0.1 fixed, so test the rollback, not just the migrate.config/auth.php; the published config's table names; the shipped User/Role/ACL models ($table, $fillable, $hidden, relationships); the service provider's bindings and overrides.web and admin guards if an admin surface exists; a single guard plus a role check is not an equivalent substitute once the admin area has its own session semantics.migrate → migrate:rollback CI job against a throwaway database.The highest-leverage pattern in the whole integration: define abilities once in Gate::define, check them via @can and $this->authorize, and let only the Gate::define bodies touch the package's role API. Roles/ACL become the data source; Gate becomes the boundary. If the product later migrates off Orchestra, you rewrite one provider and nothing else. Every deviation from standard Laravel auth surface at a call site should be treated as a signal worth questioning.
Estimation note. Zero community corpus means unknowns resolve by reading vendor/orchestra/auth and Orchestra core. A two-hour problem in a popular package can be a two-day problem here. Budget an explicit discovery spike and name it as schedule risk rather than absorbing it into a general buffer.
Maintenance. The package is driven by the Orchestra upgrade treadmill, and auth majors arrive as Orchestra majors. Every one of those is a release event on the login path, not a routine bump — stage each behind a login/reset/authorization smoke test and read Orchestra's release notes, not just this package's. Assign a single named owner for the auth dependency; shared ownership of a lightly adopted security component is how upgrades silently stall. Prefer extension points in this order: your own Gate::define, subclassed models wired through config/auth.php, published config, service-container rebinding in your own provider. Editing published migrations or vendor source converts the next patch release into a manual merge.
Support. No Stack Overflow corpus, no third-party bug reports, no upgrade blog posts, no established disclosure path demonstrated by adoption. Debugging starts at vendor/orchestra/auth. The mitigations are structural, not heroic: name an owner, get the maintainer's support expectations in writing, and build the rollback CI job so the one known regression class becomes a red build instead of a staging incident.
Scaling. Users, roles, and pivot/ACL tables are conventional relational schema — scaling is the application database's problem, and the guard/provider abstraction will not be the bottleneck. The scaling concern that actually matters is authorization-surface growth: as capabilities multiply, the risk is logic leaking into controllers and views. Gate/Policy centralization is the scaling strategy, not just a style preference. Keep table names in config, never in vendor code; any rename needs the config value and the migration changed together plus a fresh-install test.
Failure modes to plan for:
Class config not found from a testing environment) — fixed in v5.0.1, recurs if migrations were forked locally..env changes to guards, providers, or table names silently ignored; symptom is "works locally, cannot log in on staging."providers.users.model produces "wrong user instance" bugs that are painful to trace.web guard, or roles checked ad hoc rather than through Gate.Ramp-up. Low at the call site, high on internals. Onboarding cost is essentially the vendor-source read, and it should be a scheduled task with an owner rather than folklore. Hand the team the debugging recipe: use php artisan tinker against a staging user to inspect role/ACL relationships, and Gate::forUser($user)->allows('ability') to split whether a denial comes from the ability definition or from missing role data. That resolves most "permission not working" reports in one step instead of three.
Product-level read. No roadmap or prioritization change follows from v5.0.1; it is CI/test reliability only. The roadmap-relevant decision is upstream of this release: whether the platform commitment justifies relying on a niche, low-adoption dependency in a security-sensitive area, and whether owning that audit and support burden is cheaper than a mainstream alternative.
How can I help you explore Laravel packages today?