coringawc/filament-acl
Role and permission management for Filament panels. coringawc/filament-acl adds ACL resources to create roles, assign permissions, and control access to your admin resources, pages, and widgets, integrating with Laravel's authorization layer for straightforward access control.
HasResourcePermissions, HasRelationManagerPermissions, HasPagePermissions, HasWidgetPermissions) with no required base classes, so integration does not restructure the app. That makes the decision reversible — the strongest argument for buying: low switching cost if you later replace it.getManagedPermissionPanel(). That directly underwrites a roadmap where an internal panel and a customer/partner panel have different role catalogs without forking the package.Gate::before(), protected from edit/delete by RolePolicy, assignable only through an admin-user command. That is a break-glass/super-admin model, and it satisfies procurement language faster than a hand-rolled is_admin boolean.auth()->user()?->can('archive', [$record, PostResource::class]) and ->authorize('archive', PostResource::class). PMs can spec per-record custom actions in the backlog without scheduling a new Filament action class each time.Adopt when:
ChecksPermission with the permission argument last in the signature, keeping policies readable.require_explicit_opt_in = true by default; shouldRegisterPermissions(): false fully suppresses sync, UI, and checks). Good fit for large codebases where only some resources should be governed.Look elsewhere or defer when:
To executives — one paragraph: We are evaluating a small MIT-licensed plugin that adds role- and permission-management screens to our Filament admin panel, so an admin can create roles, attach granular permissions, and assign them to users without our team building or maintaining those screens. The strategic case is cost avoidance and reversibility: it integrates through optional traits rather than base classes, so if it disappoints us, removal is a contained change rather than a rewrite. It also ships a proper break-glass "protected role" model — hidden from the UI, protected from edit/delete, optionally bypassing checks — which is the language security reviews want to hear. Two caveats must be stated plainly. First, adoption is essentially zero (no community traction), so we would be treating this as an internally-owned dependency rather than a market-vetted one. Second, it is only validated on PHP 8.3+ / Filament 5 and has not been tested against Laravel 13 or PHP 8.5, so our platform-upgrade timeline cannot assume it will be ready. Recommendation: approve as a scoped, reversible build-vs-buy win, and carry it on the dependency watchlist with an owner and an exit plan.
To engineering — the short version: This buys us the role/permission admin surface on top of an existing Spatie setup, with no required BaseResource/BasePage/BaseWidget classes. Integration is four optional traits plus per-class overrides (getPermissionSubject(), shouldRegisterPermissions(), getSharedPermissionOwner(), getPermissionCustomActions(), getPermissionActions(), getPermissionPanel()). Attribute resolution is concrete-class only — no inheritance — so permission metadata must be redeclared or overridden on each child class; that is a real ergonomic cost in deep resource hierarchies and worth a spike. Policies stay native Laravel, with ChecksPermission as an opt-in helper and the permission argument last in the signature so domain rules can follow. Custom actions use standard can() / authorize() — do not build wrapper action classes. Watch three behavioral contracts before touching config: opt-out must fully suppress sync, UI, and checks; shared owners must inherit and disappear from discovery; panel-scope changes must be applied consistently across sync, resource queries, hidden-role helpers, permission lookups, and protected-role assignment. Validation evidence is respectable for a package this size — Pest/PHPStan/Pint/actionlint across eight CI jobs, SHA-pinned actions, three-day update cooldowns with immediate security patches. Open items: Laravel 13 / PHP 8.5 compatibility is unproven, and the health score needs re-reading post-release before we cite any number. Recommendation: adopt behind a feature flag on one internal panel, with a documented removal path.
How can I help you explore Laravel packages today?