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

Skip to content

Commit d665748

Browse files
committed
[Security] Include build-in config for DoctrineTokenProvider
1 parent 5a5ba5f commit d665748

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']['enabled'] ?? 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)