vendor/symfony/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php
author ymh <ymh.work@gmail.com>
Sat, 24 Sep 2011 15:40:41 +0200
changeset 0 7f95f8617b0b
permissions -rwxr-xr-x
first commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Symfony package.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Symfony\Bundle\SecurityBundle\DependencyInjection;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Symfony\Component\DependencyInjection\DefinitionDecorator;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
use Symfony\Component\DependencyInjection\Alias;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
use Symfony\Component\Config\Loader\DelegatingLoader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
use Symfony\Component\Config\Loader\LoaderResolver;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
use Symfony\Component\DependencyInjection\ContainerBuilder;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
use Symfony\Component\DependencyInjection\Reference;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
use Symfony\Component\DependencyInjection\Parameter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
use Symfony\Component\Config\FileLocator;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
 * SecurityExtension.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
 * @author Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
class SecurityExtension extends Extension
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    private $requestMatchers = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    private $contextListeners = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    private $listenerPositions = array('pre_auth', 'form', 'http', 'remember_me');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    private $factories;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    public function load(array $configs, ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        if (!array_filter($configs)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
            return;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        // first assemble the factories
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        $factoriesConfig = new FactoryConfiguration();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        $config = $this->processConfiguration($factoriesConfig, $configs);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        $factories = $this->createListenerFactories($container, $config);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        // normalize and merge the actual configuration
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        $mainConfig = new MainConfiguration($factories);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        $config = $this->processConfiguration($mainConfig, $configs);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        // load services
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        $loader->load('security.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        $loader->load('security_listeners.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        $loader->load('security_rememberme.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        $loader->load('templating_php.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        $loader->load('templating_twig.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        $loader->load('collectors.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        // set some global scalars
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        $container->setParameter('security.access.denied_url', $config['access_denied_url']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        $container->setParameter('security.authentication.session_strategy.strategy', $config['session_fixation_strategy']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
            ->getDefinition('security.access.decision_manager')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
            ->addArgument($config['access_decision_manager']['strategy'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
            ->addArgument($config['access_decision_manager']['allow_if_all_abstain'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            ->addArgument($config['access_decision_manager']['allow_if_equal_granted_denied'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        $container->setParameter('security.access.always_authenticate_before_granting', $config['always_authenticate_before_granting']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        $container->setParameter('security.authentication.hide_user_not_found', $config['hide_user_not_found']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
        $this->createFirewalls($config, $container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        $this->createAuthorization($config, $container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
        $this->createRoleHierarchy($config, $container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        if ($config['encoders']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
            $this->createEncoders($config['encoders'], $container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        // load ACL
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
        if (isset($config['acl'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
            $this->aclLoad($config['acl'], $container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        // add some required classes for compilation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        $this->addClassesToCompile(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
            'Symfony\\Component\\Security\\Http\\Firewall',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
            'Symfony\\Component\\Security\\Http\\FirewallMapInterface',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
            'Symfony\\Component\\Security\\Core\\SecurityContext',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
            'Symfony\\Component\\Security\\Core\\SecurityContextInterface',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
            'Symfony\\Component\\Security\\Core\\User\\UserProviderInterface',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
            'Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationProviderManager',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
            'Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationManagerInterface',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            'Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManager',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
            'Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManagerInterface',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
            'Symfony\\Component\\Security\\Core\\Authorization\\Voter\\VoterInterface',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
            'Symfony\\Bundle\\SecurityBundle\\Security\\FirewallMap',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
            'Symfony\\Bundle\\SecurityBundle\\Security\\FirewallContext',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
            'Symfony\\Component\\HttpFoundation\\RequestMatcher',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
            'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    private function aclLoad($config, ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
        $loader->load('security_acl.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        if (isset($config['cache']['id'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
            $container->setAlias('security.acl.cache', $config['cache']['id']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        $container->getDefinition('security.acl.voter.basic_permissions')->addArgument($config['voter']['allow_if_object_identity_unavailable']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        // custom ACL provider
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        if (isset($config['provider'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
            $container->setAlias('security.acl.provider', $config['provider']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
            return;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
        $this->configureDbalAclProvider($config, $container, $loader);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
    private function configureDbalAclProvider(array $config, ContainerBuilder $container, $loader)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
        $loader->load('security_acl_dbal.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
        if (isset($config['connection'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
            $container->setAlias('security.acl.dbal.connection', sprintf('doctrine.dbal.%s_connection', $config['connection']));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        $container->getDefinition('security.acl.cache.doctrine')->addArgument($config['cache']['prefix']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        $container->setParameter('security.acl.dbal.class_table_name', $config['tables']['class']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        $container->setParameter('security.acl.dbal.entry_table_name', $config['tables']['entry']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
        $container->setParameter('security.acl.dbal.oid_table_name', $config['tables']['object_identity']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        $container->setParameter('security.acl.dbal.oid_ancestors_table_name', $config['tables']['object_identity_ancestors']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
        $container->setParameter('security.acl.dbal.sid_table_name', $config['tables']['security_identity']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
     * Loads the web configuration.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
     * @param array            $config    An array of configuration settings
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
     * @param ContainerBuilder $container A ContainerBuilder instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
    private function createRoleHierarchy($config, ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
        if (!isset($config['role_hierarchy'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
            $container->removeDefinition('security.access.role_hierarchy_voter');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
            return;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
        $container->setParameter('security.role_hierarchy.roles', $config['role_hierarchy']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
        $container->removeDefinition('security.access.simple_role_voter');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
    private function createAuthorization($config, ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
        if (!$config['access_control']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
            return;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
        $this->addClassesToCompile(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
            'Symfony\\Component\\Security\\Http\\AccessMap',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
        ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
        foreach ($config['access_control'] as $access) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
            $matcher = $this->createRequestMatcher(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
                $container,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
                $access['path'],
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
                $access['host'],
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
                count($access['methods']) === 0 ? null : $access['methods'],
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
                $access['ip']
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
            );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
            $container->getDefinition('security.access_map')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
                      ->addMethodCall('add', array($matcher, $access['roles'], $access['requires_channel']));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
    private function createFirewalls($config, ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
        if (!isset($config['firewalls'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
            return;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
        $firewalls = $config['firewalls'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
        $providerIds = $this->createUserProviders($config, $container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
        // make the ContextListener aware of the configured user providers
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
        $definition = $container->getDefinition('security.context_listener');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
        $arguments = $definition->getArguments();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
        $userProviders = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
        foreach ($providerIds as $userProviderId) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
            $userProviders[] = new Reference($userProviderId);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
        $arguments[1] = $userProviders;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
        $definition->setArguments($arguments);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
        // create security listener factories
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
        $factories = $this->createListenerFactories($container, $config);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
        // load firewall map
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
        $mapDef = $container->getDefinition('security.firewall.map');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
        $map = $authenticationProviders = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
        foreach ($firewalls as $name => $firewall) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
            list($matcher, $listeners, $exceptionListener) = $this->createFirewall($container, $name, $firewall, $authenticationProviders, $providerIds, $factories);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
            $contextId = 'security.firewall.map.context.'.$name;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
            $context = $container->setDefinition($contextId, new DefinitionDecorator('security.firewall.context'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
            $context
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
                ->replaceArgument(0, $listeners)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
                ->replaceArgument(1, $exceptionListener)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
            ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
            $map[$contextId] = $matcher;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
        $mapDef->replaceArgument(1, $map);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
        // add authentication providers to authentication manager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
        $authenticationProviders = array_map(function($id) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
            return new Reference($id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
        }, array_values(array_unique($authenticationProviders)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
        $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
            ->getDefinition('security.authentication.manager')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
            ->replaceArgument(0, $authenticationProviders)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
        ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
    private function createFirewall(ContainerBuilder $container, $id, $firewall, &$authenticationProviders, $providerIds, array $factories)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
        // Matcher
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
        $i = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
        $matcher = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
        if (isset($firewall['request_matcher'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
            $matcher = new Reference($firewall['request_matcher']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
        } else if (isset($firewall['pattern'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
            $matcher = $this->createRequestMatcher($container, $firewall['pattern']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
        // Security disabled?
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
        if (false === $firewall['security']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
            return array($matcher, array(), null);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
        // Provider id (take the first registered provider if none defined)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
        if (isset($firewall['provider'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
            $defaultProvider = $this->getUserProviderId($firewall['provider']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
            $defaultProvider = reset($providerIds);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
        // Register listeners
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
        $listeners = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
        // Channel listener
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
        $listeners[] = new Reference('security.channel_listener');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
        // Context serializer listener
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
        if (false === $firewall['stateless']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
            $contextKey = $id;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
            if (isset($firewall['context'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
                $contextKey = $firewall['context'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
            $listeners[] = new Reference($this->createContextListener($container, $contextKey));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
        // Logout listener
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
        if (isset($firewall['logout'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
            $listenerId = 'security.logout_listener.'.$id;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
            $listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.logout_listener'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
            $listener->replaceArgument(2, $firewall['logout']['path']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
            $listener->replaceArgument(3, $firewall['logout']['target']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
            $listeners[] = new Reference($listenerId);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
            // add logout success handler
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
            if (isset($firewall['logout']['success_handler'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
                $listener->replaceArgument(4, new Reference($firewall['logout']['success_handler']));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
            // add session logout handler
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
            if (true === $firewall['logout']['invalidate_session'] && false === $firewall['stateless']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
                $listener->addMethodCall('addHandler', array(new Reference('security.logout.handler.session')));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
            // add cookie logout handler
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
            if (count($firewall['logout']['delete_cookies']) > 0) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
                $cookieHandlerId = 'security.logout.handler.cookie_clearing.'.$id;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
                $cookieHandler = $container->setDefinition($cookieHandlerId, new DefinitionDecorator('security.logout.handler.cookie_clearing'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
                $cookieHandler->addArgument($firewall['logout']['delete_cookies']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
                $listener->addMethodCall('addHandler', array(new Reference($cookieHandlerId)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
            // add custom handlers
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
            foreach ($firewall['logout']['handlers'] as $handlerId) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
                $listener->addMethodCall('addHandler', array(new Reference($handlerId)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
        // Authentication listeners
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
        list($authListeners, $defaultEntryPoint) = $this->createAuthenticationListeners($container, $id, $firewall, $authenticationProviders, $defaultProvider, $factories);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
        $listeners = array_merge($listeners, $authListeners);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
        // Access listener
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
        $listeners[] = new Reference('security.access_listener');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
        // Switch user listener
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
        if (isset($firewall['switch_user'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
            $listeners[] = new Reference($this->createSwitchUserListener($container, $id, $firewall['switch_user'], $defaultProvider));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
        // Determine default entry point
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
        if (isset($firewall['entry_point'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
            $defaultEntryPoint = $firewall['entry_point'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
        // Exception listener
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
        $exceptionListener = new Reference($this->createExceptionListener($container, $firewall, $id, $defaultEntryPoint));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
        return array($matcher, $listeners, $exceptionListener);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
    private function createContextListener($container, $contextKey)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
        if (isset($this->contextListeners[$contextKey])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
            return $this->contextListeners[$contextKey];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
        $listenerId = 'security.context_listener.'.count($this->contextListeners);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
        $listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.context_listener'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
        $listener->replaceArgument(2, $contextKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        return $this->contextListeners[$contextKey] = $listenerId;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
    private function createAuthenticationListeners($container, $id, $firewall, &$authenticationProviders, $defaultProvider, array $factories)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
        $listeners = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
        $hasListeners = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
        $defaultEntryPoint = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
        foreach ($this->listenerPositions as $position) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
            foreach ($factories[$position] as $factory) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
                $key = str_replace('-', '_', $factory->getKey());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
                if (isset($firewall[$key])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
                    $userProvider = isset($firewall[$key]['provider']) ? $this->getUserProviderId($firewall[$key]['provider']) : $defaultProvider;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
                    list($provider, $listenerId, $defaultEntryPoint) = $factory->create($container, $id, $firewall[$key], $userProvider, $defaultEntryPoint);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
                    $listeners[] = new Reference($listenerId);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
                    $authenticationProviders[] = $provider;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
                    $hasListeners = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
        // Anonymous
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
        if (isset($firewall['anonymous'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
            $listenerId = 'security.authentication.listener.anonymous.'.$id;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
            $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
                ->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.anonymous'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
                ->replaceArgument(1, $firewall['anonymous']['key'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
            ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
            $listeners[] = new Reference($listenerId);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
            $providerId = 'security.authentication.provider.anonymous.'.$id;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
            $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
                ->setDefinition($providerId, new DefinitionDecorator('security.authentication.provider.anonymous'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
                ->replaceArgument(0, $firewall['anonymous']['key'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
            ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
            $authenticationProviders[] = $providerId;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
            $hasListeners = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
        if (false === $hasListeners) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
            throw new \LogicException(sprintf('No authentication listener registered for firewall "%s".', $id));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
        return array($listeners, $defaultEntryPoint);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
    private function createEncoders($encoders, ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
        $encoderMap = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
        foreach ($encoders as $class => $encoder) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
            $encoderMap[$class] = $this->createEncoder($encoder, $container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
        $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
            ->getDefinition('security.encoder_factory.generic')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
            ->setArguments(array($encoderMap))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
        ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
    private function createEncoder($config, ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
        // a custom encoder service
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
        if (isset($config['id'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
            return new Reference($config['id']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
        // plaintext encoder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
        if ('plaintext' === $config['algorithm']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
            $arguments = array($config['ignore_case']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
            return array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
                'class' => new Parameter('security.encoder.plain.class'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
                'arguments' => $arguments,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
            );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
        // message digest encoder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
        $arguments = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
            $config['algorithm'],
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
            $config['encode_as_base64'],
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
            $config['iterations'],
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
        return array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
            'class' => new Parameter('security.encoder.digest.class'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
            'arguments' => $arguments,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
    // Parses user providers and returns an array of their ids
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
    private function createUserProviders($config, ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
        $providerIds = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
        foreach ($config['providers'] as $name => $provider) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
            $id = $this->createUserDaoProvider($name, $provider, $container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
            $providerIds[] = $id;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
        return $providerIds;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
    // Parses a <provider> tag and returns the id for the related user provider service
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
    private function createUserDaoProvider($name, $provider, ContainerBuilder $container, $master = true)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
        $name = $this->getUserProviderId(strtolower($name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
        // Existing DAO service provider
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
        if (isset($provider['id'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
            $container->setAlias($name, new Alias($provider['id'], false));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
            return $provider['id'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
        // Chain provider
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
        if ($provider['providers']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
            $providers = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
            foreach ($provider['providers'] as $providerName) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
                $providers[] = new Reference($this->getUserProviderId(strtolower($providerName)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
            $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
                ->setDefinition($name, new DefinitionDecorator('security.user.provider.chain'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
                ->addArgument($providers)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
            ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
            return $name;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
        // Doctrine Entity DAO provider
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
        if (isset($provider['entity'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
            $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
                ->setDefinition($name, new DefinitionDecorator('security.user.provider.entity'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
                ->addArgument($provider['entity']['class'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
                ->addArgument($provider['entity']['property'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
            ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
            return $name;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
        // In-memory DAO provider
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
        $definition = $container->setDefinition($name, new DefinitionDecorator('security.user.provider.in_memory'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
        foreach ($provider['users'] as $username => $user) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
            $userId = $name.'_'.$username;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
            $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
                ->setDefinition($userId, new DefinitionDecorator('security.user.provider.in_memory.user'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
                ->setArguments(array($username, (string)$user['password'], $user['roles']))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
            ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
            $definition->addMethodCall('createUser', array(new Reference($userId)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
        return $name;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
    private function getUserProviderId($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
        return 'security.user.provider.concrete.'.$name;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
    private function createExceptionListener($container, $config, $id, $defaultEntryPoint)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
        $exceptionListenerId = 'security.exception_listener.'.$id;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
        $listener = $container->setDefinition($exceptionListenerId, new DefinitionDecorator('security.exception_listener'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
        $listener->replaceArgument(3, null === $defaultEntryPoint ? null : new Reference($defaultEntryPoint));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
        // access denied handler setup
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
        if (isset($config['access_denied_handler'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
            $listener->replaceArgument(5, new Reference($config['access_denied_handler']));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
        } else if (isset($config['access_denied_url'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
            $listener->replaceArgument(4, $config['access_denied_url']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
        return $exceptionListenerId;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
    private function createSwitchUserListener($container, $id, $config, $defaultProvider)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
        $userProvider = isset($config['provider']) ? $this->getUserProviderId($config['provider']) : $defaultProvider;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
        $switchUserListenerId = 'security.authentication.switchuser_listener.'.$id;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
        $listener = $container->setDefinition($switchUserListenerId, new DefinitionDecorator('security.authentication.switchuser_listener'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
        $listener->replaceArgument(1, new Reference($userProvider));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
        $listener->replaceArgument(3, $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
        $listener->replaceArgument(6, $config['parameter']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
        $listener->replaceArgument(7, $config['role']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
        return $switchUserListenerId;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
    private function createRequestMatcher($container, $path = null, $host = null, $methods = null, $ip = null, array $attributes = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
        $serialized = serialize(array($path, $host, $methods, $ip, $attributes));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
        $id = 'security.request_matcher.'.md5($serialized).sha1($serialized);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
        if (isset($this->requestMatchers[$id])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
            return $this->requestMatchers[$id];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
        // only add arguments that are necessary
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
        $arguments = array($path, $host, $methods, $ip, $attributes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
        while (count($arguments) > 0 && !end($arguments)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
            array_pop($arguments);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
        $container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
            ->register($id, '%security.matcher.class%')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
            ->setPublic(false)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
            ->setArguments($arguments)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
        ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
        return $this->requestMatchers[$id] = new Reference($id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
    private function createListenerFactories(ContainerBuilder $container, $config)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
        if (null !== $this->factories) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
            return $this->factories;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
        // load service templates
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
        $c = new ContainerBuilder();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
        $parameterBag = $container->getParameterBag();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
        $locator = new FileLocator(__DIR__.'/../Resources/config');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
        $resolver = new LoaderResolver(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
            new XmlFileLoader($c, $locator),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
            new YamlFileLoader($c, $locator),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
            new PhpFileLoader($c, $locator),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
        ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
        $loader = new DelegatingLoader($resolver);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
        $loader->load('security_factories.xml');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
        // load user-created listener factories
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
        foreach ($config['factories'] as $factory) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
            $loader->load($parameterBag->resolveValue($factory));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
        $tags = $c->findTaggedServiceIds('security.listener.factory');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
        $factories = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
        foreach ($this->listenerPositions as $position) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
            $factories[$position] = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
        foreach (array_keys($tags) as $tag) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
            $factory = $c->get($tag);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
            $factories[$factory->getPosition()][] = $factory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
        return $this->factories = $factories;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
     * Returns the base path for the XSD files.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
     * @return string The XSD base path
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
    public function getXsdValidationBasePath()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
        return __DIR__.'/../Resources/config/schema';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
    public function getNamespace()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
        return 'http://symfony.com/schema/dic/security';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619