Как использовать несколько аутентификаторов защиты

Компонент Аутентификатора защиты позволяет вам с лёгкостью использовать много разных аутентификаторов одновременно.

Точкой входа является id сервиса (одного из ваших аутентификаторов), метод которого start() вызывается для начала процесса аутентификации.

Несколько аутентификаторов с общей точкой входа

Иногда вы будете хотеть предложить вашим пользователям разные механизмы аутентификации, такие как форма входа в систему и вход через Facebook, в то время как обе точки входа будут перенаправлять пользователя на одну и ту же страницу входа. Однако, в вашей конфигурации, вам нужно ясно указать, какую точку входа вы хотите использовать.

Вот как может выглядеть ваша конфигурация безопасности в действии:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    # app/config/security.yml
    security:
         # ...
        firewalls:
            default:
                anonymous: ~
                guard:
                    authenticators:
                        - AppBundle\Security\LoginFormAuthenticator
                        - AppBundle\Security\FacebookConnectAuthenticator
                    entry_point: AppBundle\Security\LoginFormAuthenticator
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!-- app/config/security.xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <srv:container xmlns="http://symfony.com/schema/dic/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:srv="http://symfony.com/schema/dic/services"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <config>
            <!-- ... -->
            <firewall name="default">
                <anonymous />
                <guard entry-point="AppBundle\Security\LoginFormAuthenticator">
                    <authenticator>AppBundle\Security\LoginFormAuthenticator</authenticator>
                    <authenticator>AppBundle\Security\FacebookConnectAuthenticator</authenticator>
                </guard>
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // app/config/security.php
    use AppBundle\Security\LoginFormAuthenticator;
    use AppBundle\Security\FacebookConnectAuthenticator;
    
    $container->loadFromExtension('security', array(
        // ...
        'firewalls' => array(
            'default' => array(
                'anonymous' => null,
                'guard' => array(
                    'entry_point' => '',
                    'authenticators' => array(
                        LoginFormAuthenticator::class,
                        FacebookConnectAuthenticator::class'
                    ),
                ),
            ),
        ),
    ));
    

В этом подходе есть одно ограничение - вам нужно использовать только одну точку входа.

Несколько аутентификаторов с отдельными точками входа

Тем не менее, существуют случаи применения, когда у вас есть аутентификаторы, которые защищают разные части вашего приложения. Например, у вас есть форма входа в систему, которая защищает безопасную часть вашего приложения, входную и конечную API точки, которые защищены API-токенами. Таккак вы можете сконфигурировать только одну точку входа для каждого брандмауэра, решением будет разделить конфигурацию на два отдельных брандмауэра:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # app/config/security.yml
    security:
        # ...
        firewalls:
            api:
                pattern: ^/api/
                guard:
                    authenticators:
                        - AppBundle\Security\ApiTokenAuthenticator
            default:
                anonymous: ~
                guard:
                    authenticators:
                        - AppBundle\Security\LoginFormAuthenticator
        access_control:
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/api, roles: ROLE_API_USER }
            - { path: ^/, roles: ROLE_USER }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <!-- app/config/security.xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <srv:container xmlns="http://symfony.com/schema/dic/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:srv="http://symfony.com/schema/dic/services"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <config>
            <!-- ... -->
            <firewall name="api" pattern="^/api/">
                <guard>
                    <authenticator>AppBundle\Security\ApiTokenAuthenticator</authenticator>
                </guard>
            </firewall>
            <firewall name="default">
                <anonymous />
                <guard>
                    <authenticator>AppBundle\Security\LoginFormAuthenticator</authenticator>
                </guard>
            </firewall>
            <rule path="^/login" role="IS_AUTHENTICATED_ANONYMOUSLY" />
            <rule path="^/api" role="ROLE_API_USER" />
            <rule path="^/" role="ROLE_USER" />
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    // app/config/security.php
    use AppBundle\Security\ApiTokenAuthenticator;
    use AppBundle\Security\LoginFormAuthenticator;
    
    $container->loadFromExtension('security', array(
        // ...
        'firewalls' => array(
            'api' => array(
                'pattern' => '^/api',
                'guard' => array(
                    'authenticators' => array(
                        ApiTokenAuthenticator::class,
                    ),
                ),
            ),
            'default' => array(
                'anonymous' => null,
                'guard' => array(
                    'authenticators' => array(
                        LoginFormAuthenticator::class,
                    ),
                ),
            ),
        ),
        'access_control' => array(
            array('path' => '^/login', 'role' => 'IS_AUTHENTICATED_ANONYMOUSLY'),
            array('path' => '^/api', 'role' => 'ROLE_API_USER'),
            array('path' => '^/', 'role' => 'ROLE_USER'),
        ),
    ));
    

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.