Как использовать несколько поставщиков пользователей

Каждый механизм аутентификации (например, HTTP-аутентификация, форма входа в систему и т.д.) использует только одного поставщика пользователя и будет использовать первого объявленного поставщика пользователя по умолчанию. Но что, если вы хотите указать несколько пользователей через конфигурацию, а остальных ваших пользователей в БД? Это возможно, если создать нового поставщика, который свяжет конфигурацию и базу данных:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    # app/config/security.yml
    security:
        providers:
            chain_provider:
                chain:
                    providers: [in_memory, user_db]
            in_memory:
                memory:
                    users:
                        foo: { password: test }
            user_db:
                entity: { class: AppBundle\Entity\User, property: username }
    
  • 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
    27
    <!-- 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>
            <provider name="chain_provider">
                <chain>
                    <provider>in_memory</provider>
                    <provider>user_db</provider>
                </chain>
            </provider>
    
            <provider name="in_memory">
                <memory>
                    <user name="foo" password="test" />
                </memory>
            </provider>
    
            <provider name="user_db">
                <entity class="AppBundle\Entity\User" property="username" />
            </provider>
        </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
    // app/config/security.php
    use AppBundle\Entity\User;
    
    $container->loadFromExtension('security', array(
        'providers' => array(
            'chain_provider' => array(
                'chain' => array(
                    'providers' => array('in_memory', 'user_db'),
                ),
            ),
            'in_memory' => array(
                'memory' => array(
                   'users' => array(
                       'foo' => array('password' => 'test'),
                   ),
                ),
            ),
            'user_db' => array(
                'entity' => array(
                    'class'    => User::class,
                    'property' => 'username',
                ),
            ),
        ),
    ));
    

Теперь все механизмы аутентификации будут использовать chain_provider, так как он указан первым. chain_provider в свою очередь будет пробовать загрузить пользователя из поставщиков in_memory и user_db.

Вы также можете сконфигурировать брандмауэр или индивидуальные механизмы аутентификации, чтобы они использовали конкретного поставщика. Опять же, если поставщик не указан ясно, то всегда будет испльзоваться первый:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    # app/config/security.yml
    security:
        firewalls:
            secured_area:
                # ...
                pattern: ^/
                provider: user_db
                http_basic:
                    realm: 'Secured Demo Area'
                    provider: in_memory
                form_login: ~
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <!-- 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="secured_area" pattern="^/" provider="user_db">
                <!-- ... -->
                <http-basic realm="Secured Demo Area" provider="in_memory" />
                <form-login />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    // app/config/security.php
    $container->loadFromExtension('security', array(
        'firewalls' => array(
            'secured_area' => array(
                // ...
                'pattern' => '^/',
                'provider' => 'user_db',
                'http_basic' => array(
                    // ...
                    'realm' => 'Secured Demo Area',
                    'provider' => 'in_memory',
                ),
                'form_login' => array(),
            ),
        ),
    ));
    

В этом примере, если пользователь пытается выполнить вход через HTTP-аутентификацию, то система аутентификации будет использовать поставщика пользователя in_memory. Но если пользователь пытается выполнить вход через форму входа, то будет использован поставщик user_db (так как он установлен по умолчаню для всего брандмауэра).

Чтобы узнать больше информации о поставщиках пользователей и конфигурации брандмауэра, смотрите SecurityBundle Configuration ("security").

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