Skip to content

Commit 57ae50e

Browse files
schmittjohfabpot
authored andcommitted
[Security] many improvements, and fixes
1 parent fb889a2 commit 57ae50e

File tree

77 files changed

+3771
-261
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+3771
-261
lines changed

src/Symfony/Bundle/DoctrineBundle/Security/EntityUserProvider.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ public function loadUserByAccount(AccountInterface $account)
6565
throw new UnsupportedAccountException(sprintf('Instances of "%s" are not supported.', get_class($account)));
6666
}
6767

68-
return $this->loadUserByUsername((string) $account);
68+
return $this->loadUserByUsername($account->getUsername());
69+
}
70+
71+
/**
72+
* {@inheritDoc}
73+
*/
74+
public function supportsClass($class)
75+
{
76+
return $class === $this->class;
6977
}
7078
}

src/Symfony/Bundle/DoctrineMongoDBBundle/Command/LoadDataFixturesDoctrineODMCommand.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ protected function execute(InputInterface $input, OutputInterface $output)
7272
}
7373
}
7474

75-
$paths = array_filter($paths, 'is_dir');
76-
7775
$loader = new \Doctrine\Common\DataFixtures\Loader();
7876
foreach ($paths as $path) {
7977
$loader->loadFromDirectory($path);

src/Symfony/Bundle/DoctrineMongoDBBundle/Security/DocumentUserProvider.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ public function loadUserByAccount(AccountInterface $account)
6565
throw new UnsupportedAccountException(sprintf('Instances of "%s" are not supported.', get_class($account)));
6666
}
6767

68-
return $this->loadUserByUsername((string) $account);
68+
return $this->loadUserByUsername($account->getUsername());
69+
}
70+
71+
/**
72+
* {@inheritDoc}
73+
*/
74+
public function supportsClass($class)
75+
{
76+
return $class === $this->class;
6977
}
7078
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
4+
5+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
6+
use Symfony\Component\DependencyInjection\ContainerBuilder;
7+
use Symfony\Component\DependencyInjection\Reference;
8+
9+
class AddAuthenticationProvidersPass implements CompilerPassInterface
10+
{
11+
public function process(ContainerBuilder $container)
12+
{
13+
if (!$container->hasDefinition('security.authentication.manager')) {
14+
return;
15+
}
16+
17+
$providers = array();
18+
foreach ($container->findTaggedServiceIds('security.authentication_provider') as $id => $attributes) {
19+
$providers[] = new Reference($id);
20+
}
21+
22+
$container
23+
->getDefinition('security.authentication.manager')
24+
->setArguments(array($providers))
25+
;
26+
}
27+
}

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Security/Factory/FormLoginFactory.php

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,28 @@ public function create(ContainerBuilder $container, $id, $config, $userProvider,
2626
$provider = 'security.authentication.provider.dao.'.$id;
2727
$container
2828
->register($provider, '%security.authentication.provider.dao.class%')
29-
->setArguments(array(new Reference($userProvider), new Reference('security.account_checker'), new Reference('security.encoder_factory')))
29+
->setArguments(array(new Reference($userProvider), new Reference('security.account_checker'), $id, new Reference('security.encoder_factory')))
3030
->setPublic(false)
31+
->addTag('security.authentication_provider')
3132
;
3233

3334
// listener
3435
$listenerId = 'security.authentication.listener.form.'.$id;
3536
$listener = $container->setDefinition($listenerId, clone $container->getDefinition('security.authentication.listener.form'));
36-
$arguments = $listener->getArguments();
37-
$arguments[1] = new Reference($provider);
38-
$listener->setArguments($arguments);
37+
$listener->setArgument(3, $id);
3938

39+
// add remember-me tag
40+
$rememberMe = true;
41+
if (isset($config['remember-me']) && false === $config['remember-me']) {
42+
$rememberMe = false;
43+
} else if (isset($config['remember_me']) && false === $config['remember_me']) {
44+
$rememberMe = false;
45+
}
46+
if ($rememberMe) {
47+
$listener->addTag('security.remember_me_aware', array('id' => $id, 'provider' => $userProvider));
48+
}
49+
50+
// generate options
4051
$options = array(
4152
'check_path' => '/login_check',
4253
'login_path' => '/login',
@@ -53,11 +64,29 @@ public function create(ContainerBuilder $container, $id, $config, $userProvider,
5364
$options[$key] = $config[$key];
5465
}
5566
}
56-
$container->setParameter('security.authentication.form.options', $options);
57-
$container->setParameter('security.authentication.form.login_path', $options['login_path']);
58-
$container->setParameter('security.authentication.form.use_forward', $options['use_forward']);
67+
$listener->setArgument(4, $options);
68+
69+
// success handler
70+
if (isset($config['success_handler'])) {
71+
$config['success-handler'] = $config['success_handler'];
72+
}
73+
if (isset($config['success-handler'])) {
74+
$listener->setArgument(5, new Reference($config['success-handler']));
75+
}
76+
77+
// failure handler
78+
if (isset($config['failure_handler'])) {
79+
$config['failure-handler'] = $config['failure_handler'];
80+
}
81+
if (isset($config['failure-handler'])) {
82+
$listener->setArgument(6, new Reference($config['failure-handler']));
83+
}
84+
85+
// form entry point
86+
$entryPoint = $container->setDefinition($entryPointId = 'security.authentication.form_entry_point.'.$id, clone $container->getDefinition('security.authentication.form_entry_point'));
87+
$entryPoint->setArguments(array($options['login_path'], $options['use_forward']));
5988

60-
return array($provider, $listenerId, 'security.authentication.form_entry_point');
89+
return array($provider, $listenerId, $entryPointId);
6190
}
6291

6392
public function getPosition()

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Security/Factory/HttpBasicFactory.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,15 @@ public function create(ContainerBuilder $container, $id, $config, $userProvider,
2626
$provider = 'security.authentication.provider.dao.'.$id;
2727
$container
2828
->register($provider, '%security.authentication.provider.dao.class%')
29-
->setArguments(array(new Reference($userProvider), new Reference('security.account_checker'), new Reference('security.encoder_factory')))
29+
->setArguments(array(new Reference($userProvider), new Reference('security.account_checker'), $id, new Reference('security.encoder_factory')))
3030
->setPublic(false)
31+
->addTag('security.authentication_provider')
3132
;
3233

3334
// listener
3435
$listenerId = 'security.authentication.listener.basic.'.$id;
3536
$listener = $container->setDefinition($listenerId, clone $container->getDefinition('security.authentication.listener.basic'));
36-
$arguments = $listener->getArguments();
37-
$arguments[1] = new Reference($provider);
38-
$listener->setArguments($arguments);
37+
$listener->setArgument(2, $id);
3938

4039
if (isset($config['path'])) {
4140
$container->setParameter('security.authentication.form.path', $config['path']);

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Security/Factory/HttpDigestFactory.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,15 @@ public function create(ContainerBuilder $container, $id, $config, $userProvider,
2626
$provider = 'security.authentication.provider.dao.'.$id;
2727
$container
2828
->register($provider, '%security.authentication.provider.dao.class%')
29-
->setArguments(array(new Reference($userProvider), new Reference('security.account_checker'), new Reference('security.encoder_factory')))
29+
->setArguments(array(new Reference($userProvider), new Reference('security.account_checker'), $id, new Reference('security.encoder_factory')))
3030
->setPublic(false)
31+
->addTag('security.authentication_provider')
3132
;
3233

3334
// listener
3435
$listenerId = 'security.authentication.listener.digest.'.$id;
3536
$listener = $container->setDefinition($listenerId, clone $container->getDefinition('security.authentication.listener.digest'));
36-
$arguments = $listener->getArguments();
37-
$arguments[1] = new Reference($userProvider);
38-
$listener->setArguments($arguments);
37+
$listener->setArgument(2, $id);
3938

4039
if (null === $defaultEntryPoint) {
4140
$defaultEntryPoint = 'security.authentication.digest_entry_point';
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?php
2+
3+
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Security\Factory;
4+
5+
use Symfony\Component\DependencyInjection\Reference;
6+
use Symfony\Component\DependencyInjection\Parameter;
7+
use Symfony\Component\DependencyInjection\ContainerBuilder;
8+
9+
class RememberMeFactory implements SecurityFactoryInterface
10+
{
11+
public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
12+
{
13+
if (!isset($config['key']) || empty($config['key'])) {
14+
throw new \RuntimeException('A "key" must be defined for each remember-me section.');
15+
}
16+
17+
if (isset($config['provider'])) {
18+
throw new \RuntimeException('You must not set a user provider for remember-me.');
19+
}
20+
21+
// authentication provider
22+
$authenticationProviderId = 'security.authentication.provider.rememberme.'.$id;
23+
$container
24+
->register($authenticationProviderId, '%security.authentication.provider.rememberme.class%')
25+
->setArguments(array(new Reference('security.account_checker'), $config['key'], $id))
26+
->setPublic(false)
27+
->addTag('security.authentication_provider')
28+
;
29+
30+
// remember me services
31+
if (isset($config['token_provider'])) {
32+
$config['token-provider'] = $config['token_provider'];
33+
}
34+
if (isset($config['token-provider'])) {
35+
$templateId = 'security.authentication.rememberme.services.persistent';
36+
$rememberMeServicesId = $templateId.'.'.$id;
37+
} else {
38+
$templateId = 'security.authentication.rememberme.services.simplehash';
39+
$rememberMeServicesId = $templateId.'.'.$id;
40+
}
41+
42+
if ($container->hasDefinition('security.logout_listener.'.$id)) {
43+
$container
44+
->getDefinition('security.logout_listener.'.$id)
45+
->addMethodCall('addHandler', array(new Reference($rememberMeServicesId)))
46+
;
47+
}
48+
49+
$rememberMeServices = $container->setDefinition($rememberMeServicesId, clone $container->getDefinition($templateId));
50+
$arguments = $rememberMeServices->getArguments();
51+
$arguments[1] = $config['key'];
52+
$arguments[2] = $id;
53+
54+
if (isset($config['token-provider'])) {
55+
// FIXME: make the naming assumption more flexible
56+
$rememberMeServices->addMethodCall('setTokenProvider', array(
57+
new Reference('security.rememberme.token.provider.'.$config['token-provider'])
58+
));
59+
}
60+
61+
// remember-me options
62+
foreach ($arguments[3] as $name => $option) {
63+
if (array_key_exists($name, $config)) {
64+
$arguments[3][$name] = $config[$name];
65+
}
66+
}
67+
$rememberMeServices->setArguments($arguments);
68+
69+
// attach to remember-me aware listeners
70+
$userProviders = array();
71+
foreach ($container->findTaggedServiceIds('security.remember_me_aware') as $serviceId => $attributes) {
72+
foreach ($attributes as $attribute) {
73+
if (!isset($attribute['id']) || $attribute['id'] !== $id) {
74+
continue;
75+
}
76+
77+
if (!isset($attribute['provider'])) {
78+
throw new \RuntimeException('Each "security.remember_me_aware" tag must have a provider attribute.');
79+
}
80+
81+
$userProviders[] = new Reference($attribute['provider']);
82+
$container
83+
->getDefinition($serviceId)
84+
->addMethodCall('setRememberMeServices', array(new Reference($rememberMeServicesId)))
85+
;
86+
}
87+
}
88+
if (count($userProviders) === 0) {
89+
throw new \RuntimeException('You must configure at least one remember-me aware listener (such as form-login) for each firewall that has remember-me enabled.');
90+
}
91+
$rememberMeServices->setArgument(0, $userProviders);
92+
93+
// remember-me listener
94+
$listenerId = 'security.authentication.listener.rememberme.'.$id;
95+
$listener = $container->setDefinition($listenerId, clone $container->getDefinition('security.authentication.listener.rememberme'));
96+
$listener->setArgument(1, new Reference($rememberMeServicesId));
97+
98+
return array($authenticationProviderId, $listenerId, $defaultEntryPoint);
99+
}
100+
101+
public function getPosition()
102+
{
103+
return 'remember_me';
104+
}
105+
106+
public function getKey()
107+
{
108+
return 'remember-me';
109+
}
110+
}

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Security/Factory/X509Factory.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,16 @@ public function create(ContainerBuilder $container, $id, $config, $userProvider,
2626
$provider = 'security.authentication.provider.pre_authenticated.'.$id;
2727
$container
2828
->register($provider, '%security.authentication.provider.pre_authenticated.class%')
29-
->setArguments(array(new Reference($userProvider), new Reference('security.account_checker')))
29+
->setArguments(array(new Reference($userProvider), new Reference('security.account_checker'), $id))
3030
->setPublic(false)
31+
->addTag('security.authentication_provider')
3132
;
3233

3334
// listener
3435
$listenerId = 'security.authentication.listener.x509.'.$id;
3536
$listener = $container->setDefinition($listenerId, clone $container->getDefinition('security.authentication.listener.x509'));
3637
$arguments = $listener->getArguments();
37-
$arguments[1] = new Reference($provider);
38+
$arguments[2] = $id;
3839
$listener->setArguments($arguments);
3940

4041
return array($provider, $listenerId, $defaultEntryPoint);

0 commit comments

Comments
 (0)