Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3a7445e

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

File tree

2 files changed

+61
-8
lines changed
Filter options

2 files changed

+61
-8
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php
+43-5Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/SecurityBundle/Resources/config/schema/security-1.0.xsd
+18-3Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.