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

Filament Permission Laravel Package

elpandape/filament-permission

elpandape/filament-permission is a Filament plugin for managing roles and permissions in Laravel admin panels. It provides UI resources for creating roles, assigning permissions, and controlling access to Filament resources and pages, helping teams implement authorization quickly.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Scope and evidence base. The only artifact supplied is the v1.10.0 changelog. No package metadata, composer constraints, service-provider surface, test suite results, or downstream consumers were provided. This assessment therefore reads the release as a security-model change to a privileged-role (super-admin) governance package — evidently with a Filament-style admin panel and relation-manager UI — and flags everything that must be verified before adoption rather than asserting it.

Architecture fit. The package sits on the authorization boundary: it governs who may hold and hand on the top-tier "privileged" role, and it enforces that boundary in both policy code and panel UI (relation managers). For a TPM this is high-blast-radius territory — a defect here is a privilege-escalation or a lockout, not a cosmetic bug. It fits well where an application needs a single, well-guarded super-admin role, mediated through an operator UI, with the invariant that the platform can never be left without an administrator. It is a poorer fit for organisations needing fine-grained, delegated role administration (see the revocation tightening below) or multi-tenant scoping that the changelog does not address.

What v1.10.0 actually changes. Three behaviour changes and one API addition:

Change Direction TPM read
Privileged role is now granted by a current holder rather than by nobody Widening of UI capability (previously no path existed in-product) Deliberate, reasoned trade-off: the author argues "refuse to everybody" only pushed escalation onto a clunkier route (grant a role the whole catalogue, then hand that over). Net security posture is arguably improved by making the sanctioned path explicit and auditable — but it is a genuine capability expansion and needs security sign-off
Grant check is evaluated against the role, not its permissions, so it does not leak via grants.unrestricted Tightening / anti-leak Important: a user holding the "unrestricted grant" permission cannot use it to obtain or confer the privileged role. Good separation-of-duties property; must be regression-tested, as it is the kind of check that silently inverts
A role can only be revoked by someone who could have granted it; the relation manager no longer offers to detach roles "reaching further than the editor" Tightening Fixes a real over-permission in the UI. Most likely source of user-visible workflow breakage — role admins will lose detach buttons they previously had
The privileged role cannot be stripped from its last holder Tightening / availability guard Prevents the classic "panel with no admins, fixable only by SSH" outage. Operationally this means a deliberate de-privileging of the final holder is now impossible in-product — a runbook item, not a bug
PrivilegedRole::isLastHolder() added API surface Small, useful primitive; lets our own code and tests assert the lockout invariant. Public API means semver commitment — treat as a support obligation

Technical risk.

  • Silent authorization drift. Two of the three behaviour changes narrow access and one widens it. Nothing here is a crash-level break; the failure mode is a user quietly losing an action or quietly gaining one. That argues for an explicit authorization test matrix rather than "it boots, ship it."
  • No stated migration path or config toggle. The notes describe no opt-out, no deprecation, no upgrade instructions, and do not say whether prior behaviour is recoverable. For a minor version bump (1.9 → 1.10) this is a notable amount of behavioural change; consumers pinning ^1.9 will absorb it silently.
  • Auditability is unstated. Whether granting/revoking the privileged role emits an event or audit record is not mentioned. Given that the release justifies itself on "the rule only added a longer, worse-named path to the same reach," the compensating control ought to be a trail. Confirm it exists.
  • Lockout recovery is CLI-only by design. Correct, but it means the package now has an operational dependency on shell access to the host.

Key questions for the maintainer.

  1. Is the grant/revoke change gated by config, or unconditional? Is there a documented upgrade note for 1.9 → 1.10?
  2. What is logged/emitted when the privileged role is handed on or taken back? Is there an audit hook?
  3. Does isLastHolder() consider soft-deleted or deactivated holders? A "last holder" who cannot log in is not a holder in practice.
  4. How is grants.unrestricted scoped — global, per-panel, per-tenant? Does the anti-leak check hold in multi-tenant panels?
  5. Is the "could have granted it" revocation rule evaluated against the current grant policy (so policy changes retroactively alter who can revoke)?
  6. Test coverage and CI status for the last-holder and anti-leak paths.

Integration Approach

Stack fit. Presumably a Laravel package with a Filament panel integration and a policies/gates layer. Integration is low-friction at the mechanical level — composer require/update, no migrations or schema changes are indicated — and high-friction at the governance level, because it changes who can do what in the admin UI. Budget effort for policy review and QA, not for plumbing.

Compatibility and version stance. Treat v1.10.0 as behaviourally breaking inside a minor version. Pin exactly (1.10.0) rather than floating ^1.10 until the next patch is reviewed, and confirm PHP/Laravel/Filament constraint compatibility against the package's composer.json before scheduling — the changelog does not state supported versions.

Migration path.

  1. Diff v1.9.x → v1.10.0 source for the policy/gate classes and the relation manager classes; the changelog is a summary, not a specification.
  2. Enumerate every in-app reference to the privileged role and every custom policy, resource, or relation manager that subclasses or overrides the package's behaviour.
  3. Search the codebase and test suite for assumptions of the old model — e.g. tests asserting that granting the privileged role fails, or that a role admin can detach an elevated role.
  4. Build a role × action matrix (holder / non-holder-with-unrestricted-grant / role-admin / ordinary admin × grant privileged / revoke privileged / revoke elevated role / revoke own role) and assert expected outcomes in tests.
  5. Only then roll forward.

Sequencing.

  • Week 0 — Discovery. Source diff, policy inventory, maintainer questions above.
  • Week 0–1 — Test matrix + upgrade notes. Add regression tests for the anti-leak check and the last-holder guard; document the removed detach affordances.
  • Week 1 — Staging soak. Deploy with a production-like role set; exercise the grant-handover path end to end, including a deliberate attempt at a last-holder strip and a CLI recovery drill.
  • Week 2 — Production. Ship behind an internal change record; announce to admin users before deploy that some detach actions are gone and that handing on the privileged role is now a first-class action.
  • Post-deploy. Confirm with support that no admin has reported a missing action; verify the audit trail captured the first real handover.

If the maintainer cannot confirm audit logging or a documented upgrade path, sequence a security review gate ahead of the staging soak rather than parallel to it.

Operational Impact

Maintenance. Small, stable surface — one new public method is the entire forward-compatibility commitment. Ongoing cost is dominated by reviewing future releases of this package carefully, not by upkeep. Set the expectation that every release touching the privileged-role rules gets a policy diff review; the changelog's prose style is explanatory rather than precise, so source review is mandatory.

Support and process. Three runbook and training updates are required at go-live:

  • Granting the privileged role is now an in-product action. Document who may do it and require a second pair of eyes (ticket + approver) — the package permits it, your process should still gate it. This is the single most important human control introduced by the release.
  • De-privileging the final holder is impossible in-product. Runbook must cover the CLI recovery path, name who holds break-glass host access, and be rehearsed. Also define the intended procedure for legitimately retiring the last admin — it is now a two-step (grant a successor, then revoke), not a one-step.
  • Some detach actions disappear from the relation manager. Expect support tickets from role admins. Pre-empt with a short note; the removal is correct (those users could previously detach roles more powerful than their own) and should be explained as such, not apologised for.

Scaling. No scaling concern in the performance sense — this is authorization logic, not a hot path. The scaling limit is administrative: with more admins and more roles, the "you may only revoke what you could grant" rule pushes delegated role management up to holders. At small scale that is a feature (separation of duties). At organisational scale it can create a bottleneck where every role change routes through a handful of super admins. If delegation is a near-term requirement, treat this as a known constraint and plan either a scoped-role design or a documented exception process — do not work around it by broadening the privileged role.

Failure modes.

Failure Likelihood Impact Mitigation
Admin loses a detach action they depended on Medium Low–Medium (process friction, support load) Pre-announce; document the grant-then-revoke path
Over-broad handover of the privileged role (no process gate) Medium High (privilege escalation) Approval workflow outside the package; audit review
Anti-leak check regresses in a future release, letting grants.unrestricted confer the privileged role Low High Regression test in your own suite; assert on every upgrade
Last-holder guard misjudges "holder" (deactivated/soft-deleted users) Low–Medium High (panel with no usable admin) Test with a deactivated sole holder; maintain verified CLI recovery drill
Silent behavioural change absorbed by a floating version constraint Medium Medium–High Pin exact versions; gate package upgrades on policy diff review
Audit trail for handovers absent Unknown Medium–High (compliance) Confirm with maintainer; add application-level logging if missing

Ramp-up. Roughly half a day for an engineer familiar with Laravel authorization to read the source diff and build the role × action test matrix; roughly half a day of QA to exercise the handover and lockout paths in staging; plus a short enablement note for panel administrators. The unfamiliar piece is not the code but the policy intent — the release is explicitly reasoned about who should be able to reach the top, and the team needs to agree that reasoning is acceptable for this system before shipping.

Overall recommendation. Adopt, with a policy review gate and exact version pinning. The release is a net improvement in both security posture (revocation now bounded by grant authority; no leak through grants.unrestricted) and availability (no last-holder lockout), and the maintainer shows sound reasoning about the threat model. The residual risks are process risks — unreviewed capability expansion and untested lockout recovery — not code-quality risks, and both are cheap to close.

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.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
cgv/localized-resource