digitalstate/platform-security-bundle
Installation:
composer require digitalstate/platform-security-bundle
Add to config/bundles.php:
return [
// ...
DigitalState\Bundle\PlatformSecurityBundle\PlatformSecurityBundle::class => ['all' => true],
];
First Use Case:
Load ACL data fixtures via migrations. Create a migration class extending AbstractFixture and implementing AclExtensionAwareInterface:
use Ds\Bundle\UserBundle\Migration\Extension\AclExtensionAwareTrait;
class LoadAclData extends AbstractFixture implements AclExtensionAwareInterface
{
use AclExtensionAwareTrait;
public function load(ObjectManager $manager)
{
$this->loadAclDataFromYaml(__DIR__.'/../Resources/data/acl.yml');
}
}
Key Files:
Migration/Extension/AclExtension.php (core ACL logic)Resources/config/services.xml (bundle services)Resources/data/acl.ymlACL Fixture Loading:
loadAclDataFromYaml() in migrations to load YAML-based ACL rules.resources:
entity_name:
- { permission: 'VIEW', role: 'ROLE_USER' }
- { permission: 'EDIT', role: 'ROLE_ADMIN' }
Integration with OroSecurityBundle:
ROLE_USER, ROLE_ADMIN) or define custom ones.AclExtensionAwareTrait to access ACL helpers in migrations.Custom ACL Logic:
AclExtension to add custom rule validation or transformations.$this->aclExtension->setCustomRuleTransformer(function ($rule) {
$rule['permission'] = strtoupper($rule['permission']);
return $rule;
});
Dependency Injection:
AclExtension directly into services:
use Ds\Bundle\UserBundle\Migration\Extension\AclExtension;
class MyService {
public function __construct(private AclExtension $aclExtension) {}
}
doctrine:migrations:load commands.security.yaml and reference them in YAML fixtures.AclExtension in unit tests to isolate ACL logic:
$this->aclExtension = $this->createMock(AclExtension::class);
$this->aclExtension->method('loadAclDataFromYaml')->willReturn(true);
YAML Parsing Errors:
resources.entity.permission.role).var_dump($this->aclExtension->getAclDataFromYaml(file)).ACL Caching:
php bin/console cache:clear
Namespace Conflicts:
Ds\Bundle\UserBundle namespace. If using a custom bundle, override the service definition:
# config/services.yaml
Ds\Bundle\UserBundle\Migration\Extension\AclExtension:
alias: 'your_bundle.acl_extension'
Migration Order:
LoadUserData before LoadAclData).Enable ACL Debugging:
Add to config/packages/security.yaml:
oro_security:
acl:
debug: true
Logs ACL operations to var/log/dev.log.
Check Loaded Rules: Dump ACL rules in a controller:
$aclHelper = $this->get('oro_security.acl_helper');
dump($aclHelper->getAclProvider()->getResources());
Custom ACL Providers:
Extend Oro\Bundle\SecurityBundle\Acl\Domain\ObjectIdentityProvider to support custom entities.
Post-Load Hooks:
Override AclExtension::postLoadAclData() to run logic after fixture loading:
public function postLoadAclData(array $data)
{
// Custom logic (e.g., log loaded rules)
}
YAML Schema Validation:
Add validation to AclExtension::validateAclData() to enforce custom rules:
public function validateAclData(array $data): bool
{
if (!isset($data['resources'])) {
throw new \InvalidArgumentException('ACL data must include "resources" key.');
}
return true;
}
Event Listeners:
Listen for oro_security.acl_rule.load events to modify rules dynamically:
$eventDispatcher->addListener('oro_security.acl_rule.load', function ($event) {
$event->setRule(['permission' => 'CUSTOM_' . $event->getRule()['permission']]);
});
How can I help you explore Laravel packages today?