11
11
12
12
namespace Symfony \Bundle \SecurityBundle \DependencyInjection \Security \Factory ;
13
13
14
+ use Symfony \Bridge \Doctrine \Security \RememberMe \DoctrineTokenProvider ;
14
15
use Symfony \Component \Config \Definition \Builder \NodeDefinition ;
16
+ use Symfony \Component \Config \Definition \Exception \InvalidConfigurationException ;
15
17
use Symfony \Component \Config \FileLocator ;
16
18
use Symfony \Component \DependencyInjection \Argument \IteratorArgument ;
17
19
use Symfony \Component \DependencyInjection \ChildDefinition ;
@@ -101,41 +103,40 @@ public function createAuthenticator(ContainerBuilder $container, string $firewal
101
103
$ loader ->load ('security_authenticator_remember_me.php ' );
102
104
}
103
105
104
- // create remember me handler (which manage the remember me cookies)
106
+ // create remember me handler (which manage the remember- me cookies)
105
107
$ rememberMeHandlerId = 'security.authenticator.remember_me_handler. ' .$ firewallName ;
106
108
if (isset ($ config ['service ' ]) && isset ($ config ['token_provider ' ])) {
107
109
throw new InvalidConfigurationException (sprintf ('You cannot use both "service" and "token_provider" in "security.firewalls.%s.remember_me". ' , $ firewallName ));
108
110
}
109
111
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 ' ]))
114
114
->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 ' ]);
116
117
$ 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 ))
118
119
->replaceArgument (2 , new Reference ($ userProviderId ))
119
- ->replaceArgument (4 , $ options )
120
+ ->replaceArgument (4 , $ config )
120
121
->addTag ('security.remember_me_handler ' , ['firewall ' => $ firewallName ]);
121
122
} else {
122
123
$ signatureHasherId = 'security.authenticator.remember_me_signature_hasher. ' .$ firewallName ;
123
124
$ container ->setDefinition ($ signatureHasherId , new ChildDefinition ('security.authenticator.remember_me_signature_hasher ' ))
124
- ->replaceArgument (1 , $ options ['signature_properties ' ])
125
+ ->replaceArgument (1 , $ config ['signature_properties ' ])
125
126
;
126
127
127
128
$ container ->setDefinition ($ rememberMeHandlerId , new ChildDefinition ('security.authenticator.signature_remember_me_handler ' ))
128
129
->replaceArgument (0 , new Reference ($ signatureHasherId ))
129
130
->replaceArgument (1 , new Reference ($ userProviderId ))
130
- ->replaceArgument (3 , $ options )
131
+ ->replaceArgument (3 , $ config )
131
132
->addTag ('security.remember_me_handler ' , ['firewall ' => $ firewallName ]);
132
133
}
133
134
134
135
// create remember me listener (which executes the remember me services for other authenticators and logout)
135
136
$ rememberMeListenerId = 'security.listener.remember_me. ' .$ firewallName ;
136
137
$ container ->setDefinition ($ rememberMeListenerId , new ChildDefinition ('security.listener.remember_me ' ))
137
138
->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 ]))
139
140
->addTag ('kernel.event_subscriber ' , ['dispatcher ' => 'security.event_dispatcher. ' .$ firewallName ])
140
141
;
141
142
@@ -179,7 +180,6 @@ public function addConfiguration(NodeDefinition $node)
179
180
$ builder
180
181
->scalarNode ('secret ' )->isRequired ()->cannotBeEmpty ()->end ()
181
182
->scalarNode ('service ' )->end ()
182
- ->scalarNode ('token_provider ' )->end ()
183
183
->arrayNode ('user_providers ' )
184
184
->beforeNormalization ()
185
185
->ifString ()->then (function ($ v ) { return [$ v ]; })
@@ -198,7 +198,7 @@ public function addConfiguration(NodeDefinition $node)
198
198
->ifString ()->then (function ($ v ) { return ['service ' => $ v ]; })
199
199
->end ()
200
200
->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 ()
202
202
->arrayNode ('doctrine ' )
203
203
->canBeEnabled ()
204
204
->children ()
@@ -245,9 +245,8 @@ private function createRememberMeServices(ContainerBuilder $container, string $i
245
245
$ rememberMeServices ->replaceArgument (2 , $ id );
246
246
247
247
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 )]);
251
250
}
252
251
253
252
// remember-me options
@@ -271,4 +270,30 @@ private function createRememberMeServices(ContainerBuilder $container, string $i
271
270
272
271
$ rememberMeServices ->replaceArgument (0 , new IteratorArgument (array_unique ($ userProviders )));
273
272
}
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
+ }
274
299
}
0 commit comments