8000 fix priority ordering of security voters · symfony/symfony@dcd19f3 · GitHub
[go: up one dir, main page]

Skip to content

Commit dcd19f3

Browse files
committed
fix priority ordering of security voters
1 parent 5032477 commit dcd19f3

File tree

2 files changed

+62
-5
lines changed

2 files changed

+62
-5
lines changed

src/Symfony/Bundle/SecurityBundle/DependencyInjection/Compiler/AddSecurityVotersPass.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ public function process(ContainerBuilder $container)
3131
return;
3232
}
3333

34-
$voters = new \SplPriorityQueue();
34+
$voters = array();
3535
foreach ($container->findTaggedServiceIds('security.voter') as $id => $attributes) {
3636
$priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
37-
$voters->insert(new Reference($id), $priority);
37+
$voters[$priority][] = new Reference($id);
3838
}
3939

40-
$voters = iterator_to_array($voters);
41-
ksort($voters);
40+
krsort($voters);
41+
$voters = call_user_func_array('array_merge', $voters);
4242

43-
$container->getDefinition('security.access.decision_manager')->replaceArgument(0, array_values($voters));
43+
$container->getDefinition('security.access.decision_manager')->replaceArgument(0, $voters);
4444
}
4545
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\SecurityBundle\Tests\DependencyInjection\Compiler;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Bundle\SecurityBundle\DependencyInjection\Compiler\AddSecurityVotersPass;
16+
use Symfony\Component\DependencyInjection\ContainerBuilder;
17+
use Symfony\Component\DependencyInjection\Reference;
18+
19+
class AddSecurityVotersPassTest extends TestCase
20+
{
21+
public function testThatSecurityVotersAreProcessedInPriorityOrder()
22+
{
23+
$container = new ContainerBuilder();
24+
$container
25+
->register('security.access.decision_manager', 'Symfony\Component\Security\Core\Authorization\AccessDecisionManager')
26+
->addArgument(array())
27+
;
28+
$container
29+
->register('no_prio_service')
30+
->addTag('security.voter')
31+
;
32+
$container
33+
->register('lowest_prio_service')
34+
->addTag('security.voter', array('priority' => 100))
35+
;
36+
$container
37+
->register('highest_prio_service')
38+
->addTag('security.voter', array('priority' => 200))
39+
;
40+
$container
41+
->register('zero_prio_service')
42+
->addTag('security.voter', array('priority' => 0))
43+
;
44+
$compilerPass = new AddSecurityVotersPass();
45+
$compilerPass->process($container);
46+
47+
$this->assertEquals(
48+
array(
49+
new Reference('highest_prio_service'),
50+
new Reference('lowest_prio_service'),
< 63B5 /td>
51+
new Reference('no_prio_service'),
52+
new Reference('zero_prio_service'),
53+
),
54+
$container->getDefinition('security.access.decision_manager')->getArgument(0)
55+
);
56+
}
57+
}

0 commit comments

Comments
 (0)
0