Skip to content

Commit 82c6844

Browse files
schmittjohfabpot
authored andcommitted
[Security] moved Security classes out of DoctrineBundle, cleaned-up SecurityExtension accordingly
Note that this commit removes the built-in support for MongoDB user providers. This code can be moved back in once there is a stable release for MongoDB, but for now you have to set-up that user provider just like you would set-up any custom user provider: security: providers: document_provider: id: my.mongo.provider
1 parent dfd9218 commit 82c6844

File tree

9 files changed

+148
-92
lines changed

9 files changed

+148
-92
lines changed

src/Symfony/Bundle/DoctrineBundle/Resources/config/orm.xml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@
3737
<parameter key="doctrine.orm.metadata.staticphp_class">Doctrine\ORM\Mapping\Driver\StaticPHPDriver</parameter>
3838
<parameter key="doctrine.orm.class_metadata_factory_name">Doctrine\ORM\Mapping\ClassMetadataFactory</parameter>
3939

40-
<!-- security/user -->
41-
<parameter key="security.user.provider.entity.class">Symfony\Bundle\DoctrineBundle\Security\EntityUserProvider</parameter>
42-
43-
<!-- security/acl -->
44-
<parameter key="security.acl.collection_cache.class">Symfony\Bundle\DoctrineBundle\Security\AclCollectionCache</parameter>
45-
4640
<!-- cache warmer -->
4741
<parameter key="doctrine.orm.proxy_cache_warmer.class">Symfony\Bundle\DoctrineBundle\CacheWarmer\ProxyCacheWarmer</parameter>
4842

@@ -59,8 +53,6 @@
5953
</call>
6054
</service>
6155

62-
<service id="security.user.entity_manager" alias="doctrine.orm.default_entity_manager" public="false" />
63-
6456
<service id="doctrine.orm.proxy_cache_warmer" class="%doctrine.orm.proxy_cache_warmer.class%" public="false">
6557
<tag name="kernel.cache_warmer" />
6658
<argument type="service" id="service_container" />

src/Symfony/Bundle/SecurityBundle/DependencyInjection/Configuration.php

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,6 @@
1717
*/
1818
class Configuration
1919
{
20-
public function getAclConfigTree()
21-
{
22-
$tb = new TreeBuilder();
23-
24-
return $tb
25-
->root('security', 'array')
26-
->scalarNode('connection')->end()
27-
->scalarNode('cache')->end()
28-
->end()
29-
->buildTree();
30-
}
31-
3220
public function getFactoryConfigTree()
3321
{
3422
$tb = new TreeBuilder();
@@ -53,6 +41,7 @@ public function getMainConfigTree(array $factories)
5341
->scalarNode('session_fixation_strategy')->cannotBeEmpty()->defaultValue('migrate')->end()
5442
;
5543

44+
$this->addAclSection($rootNode);
5645
$this->addEncodersSection($rootNode);
5746
$this->addProvidersSection($rootNode);
5847
$this->addFirewallsSection($rootNode, $factories);
@@ -62,6 +51,16 @@ public function getMainConfigTree(array $factories)
6251
return $tb->buildTree();
6352
}
6453

54+
protected function addAclSection($rootNode)
55+
{
56+
$rootNode
57+
->arrayNode('acl')
58+
->scalarNode('connection')->end()
59+
->scalarNode('cache')->end()
60+
->end()
61+
;
62+
}
63+
6564
protected function addRoleHierarchySection($rootNode)
6665
{
6766
$rootNode

src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ public function __construct()
4747

4848
public function load(array $configs, ContainerBuilder $container)
4949
{
50-
$this->aclLoad($configs, $container);
51-
5250
$tmp = array_filter($configs);
5351
if (empty($tmp)) {
5452
return;
@@ -83,22 +81,10 @@ public function load(array $configs, ContainerBuilder $container)
8381
if ($config['encoders']) {
8482
$this->createEncoders($config['encoders'], $container);
8583
}
86-
}
87-
88-
protected function aclLoad(array $configs, ContainerBuilder $container)
89-
{
90-
$processor = new Processor();
91-
$config = $processor->process($this->configuration->getAclConfigTree(), $configs);
92-
93-
$loader = new XmlFileLoader($container, new FileLocator(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config')));
94-
$loader->load('security_acl.xml');
95-
96-
if (isset($config['connection'])) {
97-
$container->setAlias('security.acl.dbal.connection', sprintf('doctrine.dbal.%s_connection', $config['connection']));
98-
}
9984

100-
if (isset($config['cache'])) {
101-
$container->setAlias('security.acl.cache', sprintf('security.acl.cache.%s', $config['cache']));
85+
// load ACL
86+
if (isset($config['acl'])) {
87+
$this->aclLoad($config['acl'], $container);
10288
}
10389
}
10490

@@ -122,6 +108,20 @@ public function getAlias()
122108
return 'security';
123109
}
124110

111+
protected function aclLoad($config, ContainerBuilder $container)
112+
{
113+
$loader = new XmlFileLoader($container, new FileLocator(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config')));
114+
$loader->load('security_acl.xml');
115+
116+
if (isset($config['connection'])) {
117+
$container->setAlias('security.acl.dbal.connection', sprintf('doctrine.dbal.%s_connection', $config['connection']));
118+
}
119+
120+
if (isset($config['cache'])) {
121+
$container->setAlias('security.acl.cache', sprintf('security.acl.cache.%s', $config['cache']));
122+
}
123+
}
124+
125125
/**
126126
* Loads the web configuration.
127127
*
@@ -421,8 +421,6 @@ protected function createUserProviders($config, ContainerBuilder $container)
421421
}
422422

423423
// Parses a <provider> tag and returns the id for the related user provider service
424-
// FIXME: Replace register() calls in this method with DefinitionDecorator
425-
// and move the actual definition to an xml file
426424
protected function createUserDaoProvider($name, $provider, ContainerBuilder $container, $master = true)
427425
{
428426
$name = $this->getUserProviderId(strtolower($name));
@@ -443,42 +441,22 @@ protected function createUserDaoProvider($name, $provider, ContainerBuilder $con
443441
// Doctrine Entity DAO provider
444442
if (isset($provider['entity'])) {
445443
$container
446-
->register($name, '%security.user.provider.entity.class%')
447-
->setPublic(false)
448-
->setArguments(array(
449-
new Reference('security.user.entity_manager'),
450-
$provider['entity']['class'],
451-
$provider['entity']['property'],
452-
))
444+
->setDefinition($name, new DefinitionDecorator('security.user.provider.entity'))
445+
->addArgument($provider['entity']['class'])
446+
->addArgument($provider['entity']['property'])
453447
;
454448

455449
return $name;
456450
}
457451

458-
// Doctrine Document DAO provider
459-
if (isset($provider['document'])) {
460-
$container
461-
->register($name, '%security.user.provider.document.class%')
462-
->setPublic(false)
463-
->setArguments(array(
464-
new Reference('security.user.document_manager'),
465-
$provider['document']['class'],
466-
$provider['document']['property'],
467-
));
468-
469-
return $name;
470-
}
471-
472452
// In-memory DAO provider
473-
$definition = $container->register($name, '%security.user.provider.in_memory.class%');
474-
$definition->setPublic(false);
453+
$definition = $container->setDefinition($name, new DefinitionDecorator('security.user.provider.in_memory'));
475454
foreach ($provider['users'] as $username => $user) {
476455
$userId = $name.'_'.$username;
477456

478457
$container
479-
->register($userId, 'Symfony\Component\Security\Core\User\User')
458+
->setDefinition($userId, new DefinitionDecorator('security.user.provider.in_memory.user'))
480459
->setArguments(array($username, $user['password'], $user['roles']))
481-
->setPublic(false)
482460
;
483461

484462
$definition->addMethodCall('createUser', array(new Reference($userId)));
@@ -489,7 +467,7 @@ protected function createUserDaoProvider($name, $provider, ContainerBuilder $con
489467

490468
protected function getUserProviderId($name)
491469
{
492-
return 'security.user.provider.'.$name;
470+
return 'security.user.provider.concrete.'.$name;
493471
}
494472

495473
protected function createExceptionListener($container, $config, $id, $defaultEntryPoint)

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
<parameter key="security.encoder.digest.class">Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder</parameter>
1515
<parameter key="security.encoder.plain.class">Symfony\Component\Security\Core\Encoder\PlaintextPasswordEncoder</parameter>
1616

17+
<parameter key="security.user.provider.entity.class">Symfony\Component\Security\Core\User\EntityUserProvider</parameter>
1718
<parameter key="security.user.provider.in_memory.class">Symfony\Component\Security\Core\User\InMemoryUserProvider</parameter>
19+
<parameter key="security.user.provider.in_memory.user.class">Symfony\Component\Security\Core\User\User</parameter>
1820

1921
<parameter key="security.authentication.trust_resolver.class">Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver</parameter>
2022
<parameter key="security.authentication.trust_resolver.anonymous_class">Symfony\Component\Security\Core\Authentication\Token\AnonymousToken</parameter>
@@ -117,5 +119,15 @@
117119
<argument type="collection" />
118120
<argument type="service" id="security.exception_listener" />
119121
</service>
122+
123+
124+
<!-- Provisioning -->
125+
<service id="security.user.provider.entity" class="%security.user.provider.entity.class%" abstract="true" public="false">
126+
<argument type="service" id="security.user.entity_manager" />
127+
</service>
128+
<service id="security.user.entity_manager" alias="doctrine.orm.default_entity_manager" public="false" />
129+
130+
<service id="security.user.provider.in_memory" class="%security.user.provider.in_memory.class%" abstract="true" public="false" />
131+
<service id="security.user.provider.in_memory.user" class="%security.user.provider.in_memory.user.class%" abstract="true" public="false" />
120132
</services>
121133
</container>

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,32 @@
1111
<parameter key="security.acl.dbal.oid_ancestors_table_name">acl_object_identity_ancestors</parameter>
1212
<parameter key="security.acl.dbal.sid_table_name">acl_security_identities</parameter>
1313
<parameter key="security.acl.dbal.provider.class">Symfony\Component\Security\Acl\Dbal\MutableAclProvider</parameter>
14-
14+
1515
<parameter key="security.acl.permission_granting_strategy.class">Symfony\Component\Security\Acl\Domain\PermissionGrantingStrategy</parameter>
16-
16+
1717
<parameter key="security.acl.voter.class">Symfony\Component\Security\Acl\Voter\AclVoter</parameter>
1818
<parameter key="security.acl.voter.allow_if_object_identity_unavailable">true</parameter>
1919
<parameter key="security.acl.permission.map.class">Symfony\Component\Security\Acl\Permission\BasicPermissionMap</parameter>
20-
20+
2121
<parameter key="security.acl.object_identity_retrieval_strategy.class">Symfony\Component\Security\Acl\Domain\ObjectIdentityRetrievalStrategy</parameter>
2222
<parameter key="security.acl.security_identity_retrieval_strategy.class">Symfony\Component\Security\Acl\Domain\SecurityIdentityRetrievalStrategy</parameter>
23-
23+
2424
<parameter key="security.acl.cache.doctrine.class">Symfony\Component\Security\Acl\Domain\DoctrineAclCache</parameter>
2525
<parameter key="security.acl.cache.doctrine.prefix">sf2_acl_</parameter>
26+
27+
<parameter key="security.acl.collection_cache.class">Symfony\Component\Security\Acl\Domain\AclCollectionCache</parameter>
2628
</parameters>
2729

2830
<services>
2931
<service id="security.acl.dbal.connection" alias="doctrine.dbal.default_connection" />
30-
32+
3133
<service id="security.acl.object_identity_retrieval_strategy" class="%security.acl.object_identity_retrieval_strategy.class%" public="false"></service>
32-
34+
3335
<service id="security.acl.security_identity_retrieval_strategy" class="%security.acl.security_identity_retrieval_strategy.class%" public="false">
3436
<argument type="service" id="security.role_hierarchy" />
3537
<argument type="service" id="security.authentication.trust_resolver" />
3638
</service>
37-
39+
3840
<service id="security.acl.dbal.provider" class="%security.acl.dbal.provider.class%" public="false">
3941
<argument type="service" id="security.acl.dbal.connection" />
4042
<argument type="service" id="security.acl.permission_granting_strategy" />
@@ -49,23 +51,23 @@
4951
</service>
5052

5153
<service id="security.acl.provider" alias="security.acl.dbal.provider" />
52-
54+
5355
<service id="security.acl.permission_granting_strategy" class="%security.acl.permission_granting_strategy.class%" public="false">
5456
<call method="setAuditLogger">
5557
<argument type="service" id="security.acl.audit_logger" on-invalid="ignore" />
5658
</call>
5759
</service>
58-
60+
5961
<service id="security.acl.cache.doctrine" class="%security.acl.cache.doctrine.class%" public="false">
6062
<argument type="service" id="security.acl.cache.doctrine_cache_impl" />
6163
<argument type="service" id="security.acl.permission_granting_strategy" />
6264
<argument>%security.acl.cache.doctrine.prefix%</argument>
6365
</service>
64-
66+
6567
<service id="security.acl.cache.doctrine.cache_impl" alias="doctrine.orm.default_result_cache" public="false" />
66-
68+
6769
<service id="security.acl.permission.map" class="%security.acl.permission.map.class%" public="false"></service>
68-
70+
6971
<service id="security.acl.voter.basic_permissions" class="%security.acl.voter.class%" public="false">
7072
<argument type="service" id="security.acl.provider" />
7173
<argument type="service" id="security.acl.object_identity_retrieval_strategy" />

src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,18 @@ public function testUserProviders()
3636
{
3737
$container = $this->getContainer('container1');
3838

39-
$providers = array_values(array_filter($container->getServiceIds(), function ($key) { return 0 === strpos($key, 'security.user.provider.'); }));
39+
$providers = array_values(array_filter($container->getServiceIds(), function ($key) { return 0 === strpos($key, 'security.user.provider.concrete'); }));
4040

4141
$expectedProviders = array(
42-
'security.user.provider.default',
43-
'security.user.provider.default_foo',
44-
'security.user.provider.digest',
45-
'security.user.provider.digest_foo',
46-
'security.user.provider.basic',
47-
'security.user.provider.basic_foo',
48-
'security.user.provider.basic_bar',
49-
'security.user.provider.doctrine',
50-
'security.user.provider.service',
42+
'security.user.provider.concrete.default',
43+
'security.user.provider.concrete.default_foo',
44+
'security.user.provider.concrete.digest',
45+
'security.user.provider.concrete.digest_foo',
46+
'security.user.provider.concrete.basic',
47+
'security.user.provider.concrete.basic_foo',
48+
'security.user.provider.concrete.basic_bar',
49+
'security.user.provider.concrete.doctrine',
50+
'security.user.provider.concrete.service',
5151
);
5252

5353
$this->assertEquals(array(), array_diff($expectedProviders, $providers));
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien.potencier@symfony-project.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\Component\Security\Acl\Domain;
13+
14+
use Symfony\Component\Security\Acl\Model\AclProviderInterface;
15+
use Symfony\Component\Security\Acl\Model\ObjectIdentityRetrievalStrategyInterface;
16+
use Symfony\Component\Security\Acl\Model\SecurityIdentityRetrievalStrategyInterface;
17+
18+
/**
19+
* This service caches ACLs for an entire collection of objects.
20+
*
21+
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
22+
*/
23+
class AclCollectionCache
24+
{
25+
protected $aclProvider;
26+
protected $objectIdentityRetrievalStrategy;
27+
protected $securityIdentityRetrievalStrategy;
28+
29+
/**
30+
* Constructor
31+
*
32+
* @param AclProviderInterface $aclProvider
33+
* @param ObjectIdentityRetrievalStrategy $oidRetrievalStrategy
34+
* @param SecurityIdentityRetrievalStrategy $sidRetrievalStrategy
35+
* @return void
36+
*/
37+
public function __construct(AclProviderInterface $aclProvider, ObjectIdentityRetrievalStrategyInterface $oidRetrievalStrategy, SecurityIdentityRetrievalStrategyInterface $sidRetrievalStrategy)
38+
{
39+
$this->aclProvider = $aclProvider;
40+
$this->objectIdentityRetrievalStrategy = $oidRetrievalStrategy;
41+
$this->securityIdentityRetrievalStrategy = $sidRetrievalStrategy;
42+
}
43+
44+
/**
45+
* Batch loads ACLs for an entire collection; thus, it reduces the number
46+
* of required queries considerably.
47+
*
48+
* @param mixed $collection anything that can be passed to foreach()
49+
* @param array $tokens an array of TokenInterface implementations
50+
* @return void
51+
*/
52+
public function cache($collection, array $tokens = array())
53+
{
54+
$sids = array();
55+
foreach ($tokens as $token) {
56+
$sids = array_merge($sids, $this->securityIdentityRetrievalStrategy->getSecurityIdentities($token));
57+
}
58+
59+
$oids = array();
60+
foreach ($collection as $domainObject) {
61+
$oids[] = $this->objectIdentityRetrievalStrategy->getObjectIdentity($domainObject);
62+
}
63+
64+
$this->aclProvider->findAcls($oids, $sids);
65+
}
66+
}

0 commit comments

Comments
 (0)