dg/optimized-access-decision-manager-bundle
Install the Bundle
Add to composer.json:
"require": {
"dg/optimized-access-decision-manager-bundle": "^1.0"
}
Run composer update.
Enable in AppKernel.php
new Dg\OptimizedAccessDecisionManagerBundle\DGOptimizedAccessDecisionManagerBundle(),
First Use Case: Replace Default Access Decision Manager
In config/security.yml, replace the default access_decision_manager with:
security:
access_decision_manager:
strategy: optimized
config/security.yml (for configuration)src/AppBundle/Security/Voter/ (custom voter classes)src/AppBundle/Security/AccessDecisionManager/ (if extending further)Register Voters
Define voters in services.yml or via autowiring:
services:
AppBundle\Security\Voter\AdminVoter:
tags: ['security.voter']
Leverage Optimized Strategy The bundle caches voter results for faster access checks. Example usage in a controller:
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
public function secureAction(AuthorizationCheckerInterface $checker)
{
if ($checker->isGranted('ROLE_ADMIN')) {
// Fast due to optimized caching
}
}
Dynamic Voter Loading Useful for large applications with many voters:
// Only loads voters relevant to the current user/attributes
$this->denyAccessUnlessGranted('EDIT', $entity);
AccessDecisionManager to support custom attributes:
$dm = $container->get('security.access_decision_manager');
$dm->decide($token, ['CUSTOM_ATTRIBUTE']);
security.access_decision_manager events for logging or analytics.Caching Invalidation
php bin/console cache:clear
config.yml:
dg_optimized_access_decision_manager:
cache_voters: false
Voter Order Matters
priority in services.yml to control order:
tags: ['security.voter', { priority: 100 }]
Debugging Denials
dg_optimized_access_decision_manager:
debug: true
dg_optimized_access_decision_manager:
cache_ttl: 3600
AuthorizationCheckerInterface in tests:
$checker = $this->createMock(AuthorizationCheckerInterface::class);
$checker->method('isGranted')->willReturn(true);
AccessDecisionManager class by binding a custom implementation in services.yml:
services:
security.access_decision_manager:
class: AppBundle\Security\CustomDecisionManager
arguments: ['@security.token_storage']
How can I help you explore Laravel packages today?