Installation:
composer require nuxia/acl-bundle # Updated repo per README
Add to config/bundles.php:
return [
// ...
Nuxia\AclBundle\NuxiaAclBundle::class => ['all' => true],
];
Database Setup: Run migrations (if using Doctrine):
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
First Use Case: Define a role and permission in a controller:
use Nuxia\AclBundle\Security\Acl\Permission\PermissionMap;
use Nuxia\AclBundle\Security\Acl\Permission\Permission;
// Grant a role a permission
$permissionMap = $this->get('nuxia_acl.permission_map');
$permission = $permissionMap->getPermission('entity', 'edit');
$role = $this->get('security.role_hierarchy')->getReachableRole('ROLE_ADMIN');
$permissionMap->grant($role, $permission);
Role-Based Access Control (RBAC):
RoleHierarchy to define role inheritance (e.g., ROLE_ADMIN inherits ROLE_USER).# config/security.yaml
security:
role_hierarchy:
ROLE_ADMIN: [ROLE_USER, ROLE_EDITOR]
Permission Management:
PermissionMap service (e.g., entity.create, entity.edit).$permissionMap->grant($role, $permission);
$permissionMap->revoke($role, $permission);
Integration with Symfony Security:
use Nuxia\AclBundle\Security\Voter\AclVoter;
class EntityVoter extends AclVoter {
protected function supportsAttribute($attribute) {
return $attribute === 'EDIT';
}
}
security.yaml:
security:
access_control:
- { path: ^/admin, roles: ROLE_ADMIN, permissions: [EDIT] }
Entity-Level Permissions:
Post with PUBLISH permission):
$aclProvider = $this->get('nuxia_acl.acl_provider');
$acl = $aclProvider->createAcl($entity);
$acl->insertObjectAce($entity, 'OWNER', 'GRANT', 'EDIT');
$aclProvider->updateAcl($acl);
Deprecated Package:
alexdpy/acl-bundle is abandoned; use nuxia/acl-bundle (linked in README).Permission Caching:
php bin/console cache:clear
Doctrine ORM Dependency:
AclStorage service.Role Hierarchy Conflicts:
# Avoid implicit conflicts
ROLE_SUPER_ADMIN: ROLE_ADMIN
ROLE_ADMIN: [ROLE_USER, ROLE_EDITOR]
$acl = $aclProvider->findAcl($entity);
dump($acl->getEntries()); // Inspect permissions
config/packages/monolog.yaml:
handlers:
acl:
type: stream
path: "%kernel.logs_dir%/acl.log"
level: debug
channels: ["acl"]
Custom Permission Maps:
PermissionMap to add domain-specific permissions:
class CustomPermissionMap extends PermissionMap {
public function __construct() {
$this->addPermission('post', 'PUBLISH');
}
}
services:
app.custom_permission_map:
class: App\Security\CustomPermissionMap
tags: ['nuxia_acl.permission_map']
Override ACL Storage:
Nuxia\AclBundle\Security\Acl\AclStorageInterface for non-Doctrine setups.Event Listeners:
acl.update) to trigger side effects:
use Nuxia\AclBundle\Event\AclEvent;
$dispatcher->addListener('acl.update', function (AclEvent $event) {
// Log or notify on ACL changes
});
How can I help you explore Laravel packages today?