Skip to content

Commit 3a7445e

Browse files
committed
[Security] Include build-in config for DoctrineTokenProvider
1 parent 5c52562 commit 3a7445e

File tree

2 files changed

+61
-8
lines changed

2 files changed

+61
-8
lines changed

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

Lines changed: 43 additions & 5 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;
@@ -109,8 +111,9 @@ public function createAuthenticator(ContainerBuilder $container, string $firewal
109111
$container->setDefinition($rememberMeHandlerId, $container->getDefinition($options['service']))
110112
->addTag('security.remember_me_handler', ['firewall' => $firewallName]);
111113
} elseif (isset($options['token_provider'])) {
114+
$tokenProviderId = $this->createTokenProvider($container, $firewallName, $config['token_provider']);
112115
$container->setDefinition($rememberMeHandlerId, new ChildDefinition('security.authenticator.persistent_remember_me_handler'))
113-
->replaceArgument(0, new Reference($options['token_provider']))
116+
->replaceArgument(0, new Reference($tokenProviderId))
114117
->replaceArgument(2, new Reference($userProviderId))
115118
->replaceArgument(4, $options)
116119
->addTag('security.remember_me_handler', ['firewall' => $firewallName]);
@@ -175,7 +178,6 @@ public function addConfiguration(NodeDefinition $node)
175178
$builder
176179
->scalarNode('secret')->isRequired()->cannotBeEmpty()->end()
177180
->scalarNode('service')->end()
178-
->scalarNode('token_provider')->end()
179181
->arrayNode('user_providers')
180182
->beforeNormalization()
181183
->ifString()->then(function ($v) { return [$v]; })
@@ -191,6 +193,23 @@ public function addConfiguration(NodeDefinition $node)
191193
->end()
192194
;
193195

196+
$tokenProviderBuilder = $builder
197+
->arrayNode('token_provider')
198+
->beforeNormalization()
199+
->ifString()->then(function ($v) { return ['service' => $v]; })
200+
->end()
201+
->children()
202+
->scalarNode('service')->end();
203+
if (class_exists(DoctrineTokenProvider::class)) {
204+
$tokenProviderBuilder
205+
->arrayNode('doctrine')
206+
->canBeEnabled()
207+
->children()
208+
->scalarNode('connection')->defaultValue('default')->end()
209+
->end()
210+
->end();
211+
}
212+
194213
foreach ($this->options as $name => $value) {
195214
if ('secure' === $name) {
196215
$builder->enumNode($name)->values([true, false, 'auto'])->defaultValue('auto' === $value ? null : $value);
@@ -228,9 +247,8 @@ private function createRememberMeServices(ContainerBuilder $container, string $i
228247
$rememberMeServices->replaceArgument(2, $id);
229248

230249
if (isset($config['token_provider'])) {
231-
$rememberMeServices->addMethodCall('setTokenProvider', [
232-
new Reference($config['token_provider']),
233-
]);
250+
$tokenProviderId = $this->createTokenProvider($container, $id, $config['token_provider']);
251+
$rememberMeServices->addMethodCall('setTokenProvider', [new Reference($tokenProviderId)]);
234252
}
235253

236254
// remember-me options
@@ -249,4 +267,24 @@ private function createRememberMeServices(ContainerBuilder $container, string $i
249267

250268
$rememberMeServices->replaceArgument(0, new IteratorArgument(array_unique($userProviders)));
251269
}
270+
271+
private function createTokenProvider(ContainerBuilder $container, string $firewallName, array $config): string
272+
{
273+
$tokenProviderId = $config['service'];
274+
if ($config['doctrine'] ?? false) {
275+
if (!class_exists(DoctrineTokenProvider::class)) {
276+
throw new InvalidConfigurationException('"remember_me.token_provider.doctrine" cannot be enabled as symfony/doctrine-bridge is not installed.');
277+
}
278+
279+
$tokenProviderId = 'security.remember_me.doctrine_token_provider.'.$firewallName;
280+
$container->register($tokenProviderId, DoctrineTokenProvider::class)
281+
->addArgument(new Reference('doctrine.dbal.'.$config['doctrine']['connection'].'_connection'));
282+
}
283+
284+
if (!$tokenProviderId) {
285+
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));
286+
}
287+
288+
return $tokenProviderId;
289+
}
252290
}

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
@@ -309,9 +309,12 @@
309309
</xsd:complexType>
310310

311311
<xsd:complexType name="remember_me">
312-
<xsd:choice minOccurs="0" maxOccurs="unbounded">
313-
<xsd:element name="user-provider" type="xsd:string" />
314-
</xsd:choice>
312+
<xsd:sequence minOccurs="0">
313+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
314+
<xsd:element name="user-provider" type="xsd:string" />
315+
</xsd:choice>
316+
<xsd:element name="token-provider" type="remember_me_token_provider" />
317+
</xsd:sequence>
315318
<xsd:attribute name="name" type="xsd:string" />
316319
<xsd:attribute name="lifetime" type="xsd:integer" />
317320
<xsd:attribute name="path" type="xsd:string" />
@@ -327,6 +330,18 @@
327330
<xsd:attribute name="samesite" type="remember_me_samesite" />
328331
</xsd:complexType>
329332

333+
<xsd:complexType name="remember_me_token_provider">
334+
<xsd:sequence>
335+
<xsd:element name="doctrine" type="remember_me_token_provider_doctrine" />
336+
</xsd:sequence>
337+
<xsd:attribute name="service" type="xsd:string" />
338+
</xsd:complexType>
339+
340+
<xsd:complexType name="remember_me_token_provider_doctrine">
341+
<xsd:attribute name="enabled" type="xsd:boolean" />
342+
<xsd:attribute name="connection" type="xsd:string" />
343+
</xsd:complexType>
344+
330345
<xsd:simpleType name="remember_me_secure">
331346
<xsd:restriction base="xsd:string">
332347
<xsd:enumeration value="true" />

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy