misaf/vendra-permission
Role and permission management for Vendra: define roles, assign granular permissions, and gate access across your Laravel application. Integrates with Vendra's admin panel and Laravel's authorization layer to keep user access organized and secure.
Evidence basis. Two artifacts inform this review: the v1.11.0...v1.12.3 changelog pointer (no release body, no migration guide) and the package's internal development skill (skills/vendra-permission-development/SKILL.md), which is unusually revealing — it documents namespace, boundary, tenancy, persistence, and Filament conventions. The scoring metadata (1 star, 16.96) should be read with care: this repo is an explicit read-only subtree split of the misaf/vendra monorepo, so stars and release history measure the split artifact, not the platform. Adoption signal must come from the monorepo, not here.
Misaf\VendraPermission namespace, ships domain models, factories, seeders, policies, observers, console commands, Filament admin UI, config, migrations, translations, and tests. It extends Spatie Permission models rather than replacing them, and derives tenancy exclusively from misaf/vendra-support abstractions (TenantAwareness, BelongsToTenant, TenantSchema, TenantResolver). Consequence for a TPM: the real decision is "do we adopt the Vendra platform's authorization module," not "do we install a Composer package." If we are not already on Vendra, this package is not independently adoptable, and that changes the entire business case.Gate/Policy definitions with the module's role/permission resolution; (2) the TenantTableRegistry registration requirement — every table whose migration calls TenantSchema::addTenantColumn() must be registered in this package's service provider so vendra-tenant:enable {tenant} can retrofit schemas migrated before tenancy existed; (3) Filament v5 panel wiring through the module Plugin; (4) lockstep version alignment across the Vendra package graph. Feasible, but it is a platform integration, not a package install — scope it accordingly.self.version alignment across the Vendra package graph. Vendra modules cannot be upgraded independently — one permission-module bump implies a coordinated multi-package release wave. That is a recurring, structural cost, not a one-time one.tenant_id through TenantSchema. Schema output therefore depends on when and how the package is installed, and a missed TenantTableRegistry registration silently produces a table that the tenant-enable command cannot retrofit. Dev/prod schema parity and tenant-onboarding correctness are both at stake.misaf), MIT-licensed, small codebase. Forkability is genuinely good — but only if we plan for it before adoption, not after.declare(strict_types=1), final classes, typed signatures, PHPDoc generics, Pest coverage, composer stan (static analysis), a dedicated test suite, and a hard module-boundary rule. For a 1-star package this is well above baseline and materially lowers maintenance risk.misaf/vendra-support / vendra-tenant), or is this a new ecosystem bet? What is the monorepo's real release cadence, maintainer count, and bus factor? What is the declared PHP/Laravel/Spatie-Permission support matrix versus our targets, and does it force a Filament v5 upgrade? Which of 1.12.0–1.12.3 addressed security — is there a CVE/GHSA? Are the migrations reversible, and is the conditional tenant_id column handled in our existing environments? Is our tenant story actually vendra-tenant, and who verifies registry completeness? Do we use Pennant (feature scoping flows through the resolver's model class)? Do we need en/de/fa translations, and are JSON columns and their indexes acceptable in our schema? What is the CI status of the monorepo, and does the split repo publish it?TenantResolver; there is no tenant_aware toggle, and the module must build and run whether or not a tenant provider is installed. That design is correct but means our environment must match the platform's assumptions precisely.self.version values after reading the diff; no upgrade exposure.tenant_id drift), and stage behavior behind a config flag so authorization can revert without a redeploy.misaf/vendra-support primitives and the tenant-agnostic-but-platform-shaped model would force a vendor fork, which is a different decision with a different cost profile.Gate logic and diff decisions rather than assuming equivalence.composer why/composer outdated across the full graph — the lockstep rule makes any Vendra-version misalignment a silent-failure source. Verify Spatie Permission version constraints, Filament v5 availability on our panel, PHPStan/Pest tooling versions if we intend to contribute upstream, and cache-store behavior: permission caching semantics differ materially between Redis and array/file drivers, and cache-key cardinality scales with tenant count.CHANGELOG.md/UPGRADING.md — the gate for everything else. (2) Advisory/CVE check on the package and on Spatie Permission. (3) Confirm the platform decision (Vendra in/out). (4) Spike on a branch, including Filament plugin registration and TenantTableRegistry entries. (5) Migration dry-run against production-shaped data, tenant-enabled and tenant-less, with timing. (6) Build an authorization regression suite covering allow and deny cases; run shadow mode. (7) Staged rollout with a kill switch. (8) Adopt and pin the entire graph.$translatable choices are indexed appropriately if we use translations. Request path: authorize-dense endpoints add latency and invite N+1 if permissions resolve lazily; the skill explicitly warns about N+1 in Filament tables and relation managers, which is a useful signal that the admin UI is a real query surface at tenant scale. Tenancy: cache-key cardinality, table growth, and Pennant scoping all scale with tenant count — load-test with realistic tenant parity, not a single tenant.TenantTableRegistry registration leaving a table that vendra-tenant:enable cannot retrofit; self.version drift across the package graph producing subtle, hard-to-reproduce authorization behavior; conditional tenant_id schema drift between environments installed at different times; migration locking on large user tables; plugin/provider not registered so the admin UI silently disappears; misconfigured super-admin/bypass logic resolving to an unintended allow; and ecosystem abandonment leaving an unpatchable authz layer.How can I help you explore Laravel packages today?