@@ -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 , $ authenticationProviders , $ 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,13 @@ 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
+ // FirewallConfig
269
+ $ config = $ container ->setDefinition ($ configId , new DefinitionDecorator ('security.firewall.config ' ));
270
+
271
+ $ config ->replaceArgument (0 , $ id );
272
+
263
273
// Matcher
264
274
$ matcher = null ;
265
275
if (isset ($ firewall ['request_matcher ' ])) {
@@ -271,20 +281,28 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
271
281
$ matcher = $ this ->createRequestMatcher ($ container , $ pattern , $ host , $ methods );
272
282
}
273
283
284
+ $ config ->replaceArgument (1 , (string ) $ matcher );
285
+ $ config ->replaceArgument (2 , $ firewall ['security ' ]);
286
+
274
287
// Security disabled?
275
288
if (false === $ firewall ['security ' ]) {
276
289
return array ($ matcher , array (), null );
277
290
}
278
291
292
+ $ config ->replaceArgument (3 , $ firewall ['stateless ' ]);
293
+
279
294
// Provider id (take the first registered provider if none defined)
280
295
if (isset ($ firewall ['provider ' ])) {
281
296
$ defaultProvider = $ this ->getUserProviderId ($ firewall ['provider ' ]);
282
297
} else {
283
298
$ defaultProvider = reset ($ providerIds );
284
299
}
285
300
301
+ $ config ->replaceArgument (4 , $ defaultProvider );
302
+
286
303
// Register listeners
287
304
$ listeners = array ();
305
+ $ listenerKeys = array ();
288
306
289
307
// Channel listener
290
308
$ listeners [] = new Reference ('security.channel_listener ' );
@@ -296,11 +314,14 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
296
314
$ contextKey = $ firewall ['context ' ];
297
315
}
298
316
317
+ $ config ->replaceArgument (5 , $ contextKey );
318
+
299
319
$ listeners [] = new Reference ($ this ->createContextListener ($ container , $ contextKey ));
300
320
}
301
321
302
322
// Logout listener
303
323
if (isset ($ firewall ['logout ' ])) {
324
+ $ listenerKeys [] = 'logout ' ;
304
325
$ listenerId = 'security.logout_listener. ' .$ id ;
305
326
$ listener = $ container ->setDefinition ($ listenerId , new DefinitionDecorator ('security.logout_listener ' ));
306
327
$ listener ->replaceArgument (3 , array (
@@ -363,10 +384,13 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
363
384
// Authentication listeners
364
385
list ($ authListeners , $ defaultEntryPoint ) = $ this ->createAuthenticationListeners ($ container , $ id , $ firewall , $ authenticationProviders , $ defaultProvider , $ configuredEntryPoint );
365
386
387
+ $ config ->replaceArgument (6 , $ configuredEntryPoint ?: $ defaultEntryPoint );
388
+
366
389
$ listeners = array_merge ($ listeners , $ authListeners );
367
390
368
391
// Switch user listener
369
392
if (isset ($ firewall ['switch_user ' ])) {
393
+ $ listenerKeys [] = 'switch_user ' ;
370
394
$ listeners [] = new Reference ($ this ->createSwitchUserListener ($ container , $ id , $ firewall ['switch_user ' ], $ defaultProvider ));
371
395
}
372
396
@@ -376,7 +400,30 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
376
400
// Exception listener
377
401
$ exceptionListener = new Reference ($ this ->createExceptionListener ($ container , $ firewall , $ id , $ configuredEntryPoint ?: $ defaultEntryPoint , $ firewall ['stateless ' ]));
378
402
403
+ if (isset ($ firewall ['access_denied_handler ' ])) {
404
+ $ config ->replaceArgument (7 , $ firewall ['access_denied_handler ' ]);
405
+ }
406
+ if (isset ($ firewall ['access_denied_url ' ])) {
407
+ $ config ->replaceArgument (8 , $ firewall ['access_denied_url ' ]);
408
+ }
409
+
379
410
$ container ->setAlias (new Alias ('security.user_checker. ' .$ id , false ), $ firewall ['user_checker ' ]);
411
+ $ config ->replaceArgument (9 , $ firewall ['user_checker ' ]);
412
+
413
+ foreach ($ this ->factories as $ position ) {
414
+ foreach ($ position as $ factory ) {
415
+ $ key = str_replace ('- ' , '_ ' , $ factory ->getKey ());
416
+ if (array_key_exists ($ key , $ firewall )) {
417
+ $ listenerKeys [] = $ key ;
418
+ }
419
+ }
420
+ }
421
+
422
+ if (isset ($ firewall ['anonymous ' ])) {
423
+ $ listenerKeys [] = 'anonymous ' ;
424
+ }
425
+
426
+ $ config ->replaceArgument (10 , $ listenerKeys );
380
427
381
428
return array ($ matcher , $ listeners , $ exceptionListener );
382
429
}
0 commit comments