Skip to content

Commit ce36374

Browse files
[Security] Add setVoters() on AccessDecisionManager
1 parent a57ce90 commit ce36374

File tree

4 files changed

+18
-17
lines changed

4 files changed

+18
-17
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\DependencyInjection\Reference;
1515
use Symfony\Component\DependencyInjection\ContainerBuilder;
1616
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
17+
use Symfony\Component\DependencyInjection\Exception\LogicException;
1718

1819
/**
1920
* Adds all configured security voters to the access decision manager.
@@ -40,6 +41,10 @@ public function process(ContainerBuilder $container)
4041
$voters = iterator_to_array($voters);
4142
ksort($voters);
4243

43-
$container->getDefinition('security.access.decision_manager')->replaceArgument(0, array_values($voters));
44+
if (!$voters) {
45+
throw new LogicException('No security voters found. You need to tag at least one with "security.voter"');
46+
}
47+
48+
$container->getDefinition('security.access.decision_manager')->addMethodCall('setVoters', array(array_values($voters)));
4449
}
4550
}

src/Symfony/Bundle/SecurityBundle/Resources/config/security.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,7 @@
103103
</service>
104104

105105
<!-- Authorization related services -->
106-
<service id="security.access.decision_manager" class="%security.access.decision_manager.class%" public="false">
107-
<argument type="collection" />
108-
</service>
106+
<service id="security.access.decision_manager" class="%security.access.decision_manager.class%" public="false" />
109107

110108
<service id="security.role_hierarchy" class="%security.role_hierarchy.class%" public="false">
111109
<argument>%security.role_hierarchy.roles%</argument>

src/Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,8 @@ class AccessDecisionManager implements AccessDecisionManagerInterface
4141
*
4242
* @throws \InvalidArgumentException
4343
*/
44-
public function __construct(array $voters, $strategy = self::STRATEGY_AFFIRMATIVE, $allowIfAllAbstainDecisions = false, $allowIfEqualGrantedDeniedDecisions = true)
44+
public function __construct(array $voters = array(), $strategy = self::STRATEGY_AFFIRMATIVE, $allowIfAllAbstainDecisions = false, $allowIfEqualGrantedDeniedDecisions = true)
4545
{
46-
if (!$voters) {
47-
throw new \InvalidArgumentException('You must at least add one voter.');
48-
}
49-
5046
$strategyMethod = 'decide'.ucfirst($strategy);
5147
if (!is_callable(array($this, $strategyMethod))) {
5248
throw new \InvalidArgumentException(sprintf('The strategy "%s" is not supported.', $strategy));
@@ -58,6 +54,16 @@ public function __construct(array $voters, $strategy = self::STRATEGY_AFFIRMATIV
5854
$this->allowIfEqualGrantedDeniedDecisions = (bool) $allowIfEqualGrantedDeniedDecisions;
5955
}
6056

57+
/**
58+
* Configures the voters.
59+
*
60+
* @param VoterInterface[] $voters An array of VoterInterface instances
61+
*/
62+
public function setVoters(array $voters)
63+
{
64+
$this->voters = $voters;
65+
}
66+
6167
/**
6268
* {@inheritdoc}
6369
*/

src/Symfony/Component/Security/Core/Tests/Authorization/AccessDecisionManagerTest.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,6 @@ public function testSupportsAttribute()
4646
$this->assertFalse($manager->supportsAttribute('foo'));
4747
}
4848

49-
/**
50-
* @expectedException \InvalidArgumentException
51-
*/
52-
public function testSetVotersEmpty()
53-
{
54-
$manager = new AccessDecisionManager(array());
55-
}
56-
5749
/**
5850
* @expectedException \InvalidArgumentException
5951
*/

0 commit comments

Comments
 (0)