@@ -110,6 +110,7 @@ public function load(array $configs, ContainerBuilder $container)
110
110
'Symfony\Component\Security\Core\Authorization\AccessDecisionManager ' ,
111
111
'Symfony\Component\Security\Core\Authorization\AuthorizationChecker ' ,
112
112
'Symfony\Component\Security\Core\Authorization\Voter\VoterInterface ' ,
113
+ 'Symfony\Bundle\SecurityBundle\Security\FirewallConfig ' ,
113
114
'Symfony\Bundle\SecurityBundle\Security\FirewallMap ' ,
114
115
'Symfony\Bundle\SecurityBundle\Security\FirewallContext ' ,
115
116
'Symfony\Component\HttpFoundation\RequestMatcher ' ,
@@ -236,14 +237,18 @@ private function createFirewalls($config, ContainerBuilder $container)
236
237
$ mapDef = $ container ->getDefinition ('security.firewall.map ' );
237
238
$ map = $ authenticationProviders = array ();
238
239
foreach ($ firewalls as $ name => $ firewall ) {
239
- list ($ matcher , $ listeners , $ exceptionListener ) = $ this ->createFirewall ($ container , $ name , $ firewall , $ authenticationProviders , $ providerIds );
240
+ $ configId = 'security.firewall.map.config. ' .$ name ;
241
+
242
+ list ($ matcher , $ listeners , $ exceptionListener ) = $ this ->createFirewall ($ container , $ name , $ firewall , $ authenticatio
6D4E
nProviders , $ providerIds , $ configId );
240
243
241
244
$ contextId = 'security.firewall.map.context. ' .$ name ;
242
245
$ context = $ container ->setDefinition ($ contextId , new DefinitionDecorator ('security.firewall.context ' ));
243
246
$ context
244
247
->replaceArgument (0 , $ listeners )
245
248
->replaceArgument (1 , $ exceptionListener )
249
+ ->replaceArgument (2 , new Reference ($ configId ))
246
250
;
251
+
247
252
$ map [$ contextId ] = $ matcher ;
248
253
}
249
254
$ mapDef ->replaceArgument (1 , $ map );
@@ -258,8 +263,11 @@ private function createFirewalls($config, ContainerBuilder $container)
258
263
;
259
264
}
260
265
261
- private function createFirewall (ContainerBuilder $ container , $ id , $ firewall , &$ authenticationProviders , $ providerIds )
266
+ private function createFirewall (ContainerBuilder $ container , $ id , $ firewall , &$ authenticationProviders , $ providerIds, $ configId )
262
267
{
268
+ $ config = $ container ->setDefinition ($ configId , new DefinitionDecorator ('security.firewall.config ' ));
269
+ $ config ->replaceArgument (0 , $ id );
270
+
263
271
// Matcher
264
272
$ matcher = null ;
265
273
if (isset ($ firewall ['request_matcher ' ])) {
@@ -271,20 +279,28 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
271
279
$ matcher = $ this ->createRequestMatcher ($ container , $ pattern , $ host , $ methods );
272
280
}
273
281
282
+ $ config ->replaceArgument (1 , (string ) $ matcher );
283
+ $ config ->replaceArgument (2 , $ firewall ['security ' ]);
284
+
274
285
// Security disabled?
275
286
if (false === $ firewall ['security ' ]) {
276
287
return array ($ matcher , array (), null );
277
288
}
278
289
290
+ $ config ->replaceArgument (3 , $ firewall ['stateless ' ]);
291
+
279
292
// Provider id (take the first registered provider if none defined)
280
293
if (isset ($ firewall ['provider ' ])) {
281
294
$ defaultProvider = $ this ->getUserProviderId ($ firewall ['provider ' ]);
282
295
} else {
283
296
$ defaultProvider = reset ($ providerIds );
284
297
}
285
298
299
+ $ config ->replaceArgument (4 , $ defaultProvider );
300
+
286
301
// Register listeners
287
302
$ listeners = array ();
303
+ $ listenerKeys = array ();
288
304
289
305
// Channel listener
290
306
$ listeners [] = new Reference ('security.channel_listener ' );
@@ -296,11 +312,14 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
296
312
$ contextKey = $ firewall ['context ' ];
297
313
}
298
314
315
+ $ config ->replaceArgument (5 , $ contextKey );
316
+
299
317
$ listeners [] = new Reference ($ this ->createContextListener ($ container , $ contextKey ));
300
318
}
301
319
302
320
// Logout listener
303
321
if (isset ($ firewall ['logout ' ])) {
322
+ $ listenerKeys [] = 'logout ' ;
304
323
$ listenerId = 'security.logout_listener. ' .$ id ;
305
324
$ listener = $ container ->setDefinition ($ listenerId , new DefinitionDecorator ('security.logout_listener ' ));
306
325
$ listener ->replaceArgument (3 , array (
@@ -363,10 +382,13 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
363
382
// Authentication listeners
364
383
list ($ authListeners , $ defaultEntryPoint ) = $ this ->createAuthenticationListeners ($ container , $ id , $ firewall , $ authenticationProviders , $ defaultProvider , $ configuredEntryPoint );
365
384
385
+ $ config ->replaceArgument (6 , $ configuredEntryPoint ?: $ defaultEntryPoint );
386
+
366
387
$ listeners = array_merge ($ listeners , $ authListeners );
367
388
368
389
// Switch user listener
369
390
if (isset ($ firewall ['switch_user ' ])) {
391
+ $ listenerKeys [] = 'switch_user ' ;
370
392
$ listeners [] = new Reference ($ this ->createSwitchUserListener ($ container , $ id , $ firewall ['switch_user ' ], $ defaultProvider ));
371
393
}
372
394
@@ -376,7 +398,30 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
376
398
// Exception listener
377
399
$ exceptionListener = new Reference ($ this ->createExceptionListener ($ container , $ firewall , $ id , $ configuredEntryPoint ?: $ defaultEntryPoint , $ firewall ['stateless ' ]));
378
400
401
+ if (isset ($ firewall ['access_denied_handler ' ])) {
402
+ $ config ->replaceArgument (7 , $ firewall ['access_denied_handler ' ]);
403
+ }
404
+ if (isset ($ firewall ['access_denied_url ' ])) {
405
+ $ config ->replaceArgument (8 , $ firewall ['access_denied_url ' ]);
406
+ }
407
+
379
408
$ container ->setAlias (new Alias ('security.user_checker. ' .$ id , false ), $ firewall ['user_checker ' ]);
409
+ $ config ->replaceArgument (9 , $ firewall ['user_checker ' ]);
410
+
411
+ foreach ($ this ->factories as $ position ) {
412
+ foreach ($ position as $ factory ) {
413
+ $ key = str_replace ('- ' , '_ ' , $ factory ->getKey ());
414
+ if (array_key_exists ($ key , $ firewall )) {
415
+ $ listenerKeys [] = $ key ;
416
+ }
417
+ }
418
+ }
419
+
420
+ if (isset ($ firewall ['anonymous ' ])) {
421
+ $ listenerKeys [] = 'anonymous ' ;
422
+ }
423
+
424
+ $ config ->replaceArgument (10 , $ listenerKeys );
380
425
381
426
return array ($ matcher , $ listeners , $ exceptionListener );
382
427
}
0 commit comments