[SecurityBundle] Refactored the configuration

The configuration is now cleaner by avoiding using prototyped nodes
as additional keys. This is a BC break for existing providers.

 - MemoryProvider:

    security:
        providers:
	    my_provider:
	        memory:  # this level has been added
		    users:
		    	# ...

 - ChainProvider:

    security:
        providers:
	    my_provider:
	    	chain:  # This level has been added
		    providers:
		    	# ...
This commit is contained in:
Christophe Coevoet 2011-11-11 22:42:14 +01:00
parent 633f0e9d77
commit b107a3fdf0
8 changed files with 67 additions and 58 deletions

View File

@ -40,11 +40,6 @@ class EntityFactory implements UserProviderFactoryInterface
return 'entity'; return 'entity';
} }
public function getFixableKey()
{
return null;
}
public function addConfiguration(NodeDefinition $node) public function addConfiguration(NodeDefinition $node)
{ {
$node $node

View File

@ -301,29 +301,26 @@ class MainConfiguration implements ConfigurationInterface
->prototype('array') ->prototype('array')
; ;
/** @var $providerNodeBuilder \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition */
$providerNodeBuilder $providerNodeBuilder
->children() ->children()
->scalarNode('id')->end() ->scalarNode('id')->end()
->end() ->arrayNode('chain')
->fixXmlConfig('provider') ->fixXmlConfig('provider')
->children() ->children()
->arrayNode('providers') ->arrayNode('providers')
->beforeNormalization() ->beforeNormalization()
->ifString() ->ifString()
->then(function($v) { return preg_split('/\s*,\s*/', $v); }) ->then(function($v) { return preg_split('/\s*,\s*/', $v); })
->end()
->prototype('scalar')->end()
->end()
->end() ->end()
->prototype('scalar')->end()
->end() ->end()
->end() ->end()
; ;
/** @var $factory \Symfony\Bundle\SecurityBundle\DependencyInjection\Security\UserProvider\UserProviderFactoryInterface */
foreach ($this->userProviderFactories as $factory) { foreach ($this->userProviderFactories as $factory) {
$name = str_replace('-', '_', $factory->getKey()); $name = str_replace('-', '_', $factory->getKey());
if (null !== $factory->getFixableKey()) {
$providerNodeBuilder->fixXmlConfig($factory->getFixableKey(), $name);
}
$factoryNode = $providerNodeBuilder->children()->arrayNode($name)->canBeUnset(); $factoryNode = $providerNodeBuilder->children()->arrayNode($name)->canBeUnset();
$factory->addConfiguration($factoryNode); $factory->addConfiguration($factoryNode);

View File

@ -29,8 +29,7 @@ class InMemoryFactory implements UserProviderFactoryInterface
{ {
$definition = $container->setDefinition($id, new DefinitionDecorator('security.user.provider.in_memory')); $definition = $container->setDefinition($id, new DefinitionDecorator('security.user.provider.in_memory'));
foreach ($config['users'] as $username => $user) {
foreach ($config as $username => $user) {
$userId = $id.'_'.$username; $userId = $id.'_'.$username;
$container $container
@ -44,24 +43,24 @@ class InMemoryFactory implements UserProviderFactoryInterface
public function getKey() public function getKey()
{ {
return 'users'; return 'memory';
}
public function getFixableKey()
{
return 'user';
} }
public function addConfiguration(NodeDefinition $node) public function addConfiguration(NodeDefinition $node)
{ {
$node $node
->useAttributeAsKey('name') ->fixXmlConfig('user')
->prototype('array') ->children()
->children() ->arrayNode('users')
->scalarNode('password')->defaultValue(uniqid())->end() ->useAttributeAsKey('name')
->arrayNode('roles') ->prototype('array')
->beforeNormalization()->ifString()->then(function($v) { return preg_split('/\s*,\s*/', $v); })->end() ->children()
->prototype('scalar')->end() ->scalarNode('password')->defaultValue(uniqid())->end()
->arrayNode('roles')
->beforeNormalization()->ifString()->then(function($v) { return preg_split('/\s*,\s*/', $v); })->end()
->prototype('scalar')->end()
->end()
->end()
->end() ->end()
->end() ->end()
->end() ->end()

View File

@ -26,7 +26,5 @@ interface UserProviderFactoryInterface
function getKey(); function getKey();
function getFixableKey();
function addConfiguration(NodeDefinition $builder); function addConfiguration(NodeDefinition $builder);
} }

View File

@ -472,9 +472,9 @@ class SecurityExtension extends Extension
} }
// Chain provider // Chain provider
if ($provider['providers']) { if (isset($provider['chain'])) {
$providers = array(); $providers = array();
foreach ($provider['providers'] as $providerName) { foreach ($provider['chain']['providers'] as $providerName) {
$providers[] = new Reference($this->getUserProviderId(strtolower($providerName))); $providers[] = new Reference($this->getUserProviderId(strtolower($providerName)));
} }

View File

@ -18,26 +18,34 @@ $container->loadFromExtension('security', array(
), ),
'providers' => array( 'providers' => array(
'default' => array( 'default' => array(
'users' => array( 'memory' => array(
'foo' => array('password' => 'foo', 'roles' => 'ROLE_USER'), 'users' => array(
'foo' => array('password' => 'foo', 'roles' => 'ROLE_USER'),
),
), ),
), ),
'digest' => array( 'digest' => array(
'users' => array( 'memory' => array(
'foo' => array('password' => 'foo', 'roles' => 'ROLE_USER, ROLE_ADMIN'), 'users' => array(
'foo' => array('password' => 'foo', 'roles' => 'ROLE_USER, ROLE_ADMIN'),
),
), ),
), ),
'basic' => array( 'basic' => array(
'users' => array( 'memory' => array(
'foo' => array('password' => '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33', 'roles' => 'ROLE_SUPER_ADMIN'), 'users' => array(
'bar' => array('password' => '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33', 'roles' => array('ROLE_USER', 'ROLE_ADMIN')), 'foo' => array('password' => '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33', 'roles' => 'ROLE_SUPER_ADMIN'),
'bar' => array('password' => '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33', 'roles' => array('ROLE_USER', 'ROLE_ADMIN')),
),
), ),
), ),
'service' => array( 'service' => array(
'id' => 'user.manager', 'id' => 'user.manager',
), ),
'chain' => array( 'chain' => array(
'providers' => array('service', 'basic'), 'chain' => array(
'providers' => array('service', 'basic'),
),
), ),
), ),

View File

@ -17,21 +17,29 @@
<encoder class="JMS\FooBundle\Entity\User4" id="security.encoder.foo" /> <encoder class="JMS\FooBundle\Entity\User4" id="security.encoder.foo" />
<provider name="default"> <provider name="default">
<user name="foo" password="foo" roles="ROLE_USER" /> <memory>
<user name="foo" password="foo" roles="ROLE_USER" />
</memory>
</provider> </provider>
<provider name="digest"> <provider name="digest">
<user name="foo" password="foo" roles="ROLE_USER, ROLE_ADMIN" /> <memory>
<user name="foo" password="foo" roles="ROLE_USER, ROLE_ADMIN" />
</memory>
</provider> </provider>
<provider name="basic"> <provider name="basic">
<user name="foo" password="0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" roles="ROLE_SUPER_ADMIN" /> <memory>
<user name="bar" password="0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" roles="ROLE_USER, ROLE_ADMIN" /> <user name="foo" password="0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" roles="ROLE_SUPER_ADMIN" />
<user name="bar" password="0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" roles="ROLE_USER, ROLE_ADMIN" />
</memory>
</provider> </provider>
<provider name="service" id="user.manager" /> <provider name="service" id="user.manager" />
<provider name="chain" providers="service, basic" /> <provider name="chain">
<chain providers="service, basic" />
</provider>
<firewall name="simple" pattern="/login" security="false" /> <firewall name="simple" pattern="/login" security="false" />

View File

@ -13,19 +13,23 @@ security:
providers: providers:
default: default:
users: memory:
foo: { password: foo, roles: ROLE_USER } users:
foo: { password: foo, roles: ROLE_USER }
digest: digest:
users: memory:
foo: { password: foo, roles: 'ROLE_USER, ROLE_ADMIN' } users:
foo: { password: foo, roles: 'ROLE_USER, ROLE_ADMIN' }
basic: basic:
users: memory:
foo: { password: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33, roles: ROLE_SUPER_ADMIN } users:
bar: { password: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33, roles: [ROLE_USER, ROLE_ADMIN] } foo: { password: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33, roles: ROLE_SUPER_ADMIN }
bar: { password: 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33, roles: [ROLE_USER, ROLE_ADMIN] }
service: service:
id: user.manager id: user.manager
chain: chain:
providers: [service, basic] chain:
providers: [service, basic]
firewalls: firewalls: