Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 10e1a72

Browse files
committed
[Security] Include build-in config for DoctrineTokenProvider
1 parent ecb2894 commit 10e1a72

File tree

2 files changed

+59
-19
lines changed

2 files changed

+59
-19
lines changed

src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
namespace Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory;
1313

14+
use Symfony\Bridge\Doctrine\Security\RememberMe\DoctrineTokenProvider;
1415
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
16+
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
1517
use Symfony\Component\Config\FileLocator;
1618
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
1719
use Symfony\Component\DependencyInjection\ChildDefinition;
@@ -101,41 +103,40 @@ public function createAuthenticator(ContainerBuilder $container, string $firewal
101103
$loader->load('security_authenticator_remember_me.php');
102104
}
103105

104-
// create remember me handler (which manage the remember me cookies)
106+
// create remember me handler (which manage the remember-me cookies)
105107
$rememberMeHandlerId = 'security.authenticator.remember_me_handler.'.$firewallName;
106108
if (isset($config['service']) && isset($config['token_provider'])) {
107109
throw new InvalidConfigurationException(sprintf('You cannot use both "service" and "token_provider" in "security.firewalls.%s.remember_me".', $firewallName));
108110
}
109111

110-
// create remember me handler (which manage the remember-me cookies)
111-
$rememberMeHandlerId = 'security.authenticator.remember_me_handler.'.$firewallName;
112-
if (isset($options['service'])) {
113-
$container->setDefinition($rememberMeHandlerId, $container->getDefinition($options['service']))
112+
if (isset($config['service'])) {
113+
$container->setDefinition($rememberMeHandlerId, $container->getDefinition($config['service']))
114114
->addTag('security.remember_me_handler', ['firewall' => $firewallName]);
115-
} elseif (isset($options['token_provider'])) {
115+
} elseif (isset($config['token_provider'])) {
116+
$tokenProviderId = $this->createTokenProvider($container, $firewallName, $config['token_provider']);
116117
$container->setDefinition($rememberMeHandlerId, new ChildDefinition('security.authenticator.persistent_remember_me_handler'))
117-
->replaceArgument(0, new Reference($options['token_provider']))
118+
->replaceArgument(0, new Reference($tokenProviderId))
118119
->replaceArgument(2, new Reference($userProviderId))
119-
->replaceArgument(4, $options)
120+
->replaceArgument(4, $config)
120121
->addTag('security.remember_me_handler', ['firewall' => $firewallName]);
121122
} else {
122123
$signatureHasherId = 'security.authenticator.remember_me_signature_hasher.'.$firewallName;
123124
$container->setDefinition($signatureHasherId, new ChildDefinition('security.authenticator.remember_me_signature_hasher'))
124-
->replaceArgument(1, $options['signature_properties'])
125+
->replaceArgument(1, $config['signature_properties'])
125126
;
126127

127128
$container->setDefinition($rememberMeHandlerId, new ChildDefinition('security.authenticator.signature_remember_me_handler'))
128129
->replaceArgument(0, new Reference($signatureHasherId))
129130
->replaceArgument(1, new Reference($userProviderId))
130-
->replaceArgument(3, $options)
131+
->replaceArgument(3, $config)
131132
->addTag('security.remember_me_handler', ['firewall' => $firewallName]);
132133
}
133134

134135
// create remember me listener (which executes the remember me services for other authenticators and logout)
135136
$rememberMeListenerId = 'security.listener.remember_me.'.$firewallName;
136137
$container->setDefinition($rememberMeListenerId, new ChildDefinition('security.listener.remember_me'))
137138
->replaceArgument(0, new Reference($rememberMeHandlerId))
138-
->replaceArgument(1, array_intersect_key($options, ['always_remember_me' => true, 'remember_me_parameter' => true]))
139+
->replaceArgument(1, array_intersect_key($config, ['always_remember_me' => true, 'remember_me_parameter' => true]))
139140
->addTag('kernel.event_subscriber', ['dispatcher' => 'security.event_dispatcher.'.$firewallName])
140141
;
141142

@@ -179,7 +180,6 @@ public function addConfiguration(NodeDefinition $node)
179180
$builder
180181
->scalarNode('secret')->isRequired()->cannotBeEmpty()->end()
181182
->scalarNode('service')->end()
182-
->scalarNode('token_provider')->end()
183183
->arrayNode('user_providers')
184184
->beforeNormalization()
185185
->ifString()->then(function ($v) { return [$v]; })
@@ -198,7 +198,7 @@ public function addConfiguration(NodeDefinition $node)
198198
->ifString()->then(function ($v) { return ['service' => $v]; })
199199
->end()
200200
->children()
201-
->scalarNode('service')->info('The service ID of a custom remember me token provider.')->end()
201+
->scalarNode('service')->info('The service ID of a custom rememberme token provider.')->end()
202202
->arrayNode('doctrine')
203203
->canBeEnabled()
204204
->children()
@@ -245,9 +245,8 @@ private function createRememberMeServices(ContainerBuilder $container, string $i
245245
$rememberMeServices->replaceArgument(2, $id);
246246

247247
if (isset($config['token_provider'])) {
248-
$rememberMeServices->addMethodCall('setTokenProvider', [
249-
new Reference($config['token_provider']),
250-
]);
248+
$tokenProviderId = $this->createTokenProvider($container, $id, $config['token_provider']);
249+
$rememberMeServices->addMethodCall('setTokenProvider', [new Reference($tokenProviderId)]);
251250
}
252251

253252
// remember-me options
@@ -271,4 +270,30 @@ private function createRememberMeServices(ContainerBuilder $container, string $i
271270

272271
$rememberMeServices->replaceArgument(0, new IteratorArgument(array_unique($userProviders)));
273272
}
273+
274+
private function createTokenProvider(ContainerBuilder $container, string $firewallName, array $config): string
275+
{
276+
$tokenProviderId = $config['service'] ?? false;
277+
if ($config['doctrine']['enabled'] ?? false) {
278+
if (!class_exists(DoctrineTokenProvider::class)) {
279+
throw new InvalidConfigurationException('Cannot use the "doctrine" token provider for "remember_me" because the Doctrine Bridge is not installed. Try running "composer require symfony/doctrine-bridge".');
280+
}
281+
282+
if (null === $config['doctrine']['connection']) {
283+
$connectionId = 'database_connection';
284+
} else {
285+
$connectionId = 'doctrine.dbal.'.$config['doctrine']['connection'].'_connection';
286+
}
287+
288+
$tokenProviderId = 'security.remember_me.doctrine_token_provider.'.$firewallName;
289+
$container->register($tokenProviderId, DoctrineTokenProvider::class)
290+
->addArgument(new Reference($connectionId));
291+
}
292+
293+
if (!$tokenProviderId) {
294+
throw new InvalidConfigurationException(sprintf('No token provider was set for firewall "%s". Either configure a service ID or set "remember_me.token_provider.doctrine" to true.', $firewallName));
295+
}
296+
297+
return $tokenProviderId;
298+
}
274299
}

src/Symfony/Bundle/SecurityBundle/Resources/config/schema/security-1.0.xsd

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,12 @@
333333
</xsd:complexType>
334334

335335
<xsd:complexType name="remember_me">
336-
<xsd:choice minOccurs="0" maxOccurs="unbounded">
337-
<xsd:element name="user-provider" type="xsd:string" />
338-
</xsd:choice>
336+
<xsd:sequence minOccurs="0">
337+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
338+
<xsd:element name="user-provider" type="xsd:string" />
339+
</xsd:choice>
340+
<xsd:element name="token-provider" type="remember_me_token_provider" />
341+
</xsd:sequence>
339342
<xsd:attribute name="name" type="xsd:string" />
340343
<xsd:attribute name="lifetime" type="xsd:integer" />
341344
<xsd:attribute name="path" type="xsd:string" />
@@ -351,6 +354,18 @@
351354
<xsd:attribute name="samesite" type="remember_me_samesite" />
352355
</xsd:complexType>
353356

357+
<xsd:complexType name="remember_me_token_provider">
358+
<xsd:sequence>
359+
<xsd:element name="doctrine" type="remember_me_token_provider_doctrine" />
360+
</xsd:sequence>
361+
<xsd:attribute name="service" type="xsd:string" />
362+
</xsd:complexType>
363+
364+
<xsd:complexType name="remember_me_token_provider_doctrine">
365+
<xsd:attribute name="enabled" type="xsd:boolean" />
366+
<xsd:attribute name="connection" type="xsd:string" />
367+
</xsd:complexType>
368+
354369
<xsd:simpleType name="remember_me_secure">
355370
<xsd:restriction base="xsd:string">
356371
<xsd:enumeration value="true" />

0 commit comments

Comments
 (0)