Дата обновления перевода 2021-09-29

Встроенные поставщики аутентификации

Если вам нужно добавить аутентификацию в ваше приложение, мы рекомендуем использовать аутентификацию Guard, так как она предоставляет вам полный контроль над процессом.

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

Аутентификация HTTP Basic

Аутентификация HTTP Basic запрашивает идентификационные данные (имя пользователя и пароль) используя диалог в браузере. Идентификационные данные отправляются без хеширования или шифрования, поэтому рекомендуется использовать ее с HTTPS.

Чтобы поддержать аутентификацию HTTP Basic, добавьте ключ http_basic к вашему брандмауэру:

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # config/packages/security.yaml
    security:
        # ...
    
        firewalls:
            main:
                # ...
                http_basic:
                    realm: Secured Area
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!-- config/packages/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
            https://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/security
            https://symfony.com/schema/dic/security/security-1.0.xsd">
    
        <config>
            <!-- ... -->
    
            <firewall name="main">
                <http-basic realm="Secured Area"/>
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    // config/packages/security.php
    use Symfony\Config\SecurityConfig;
    
    return static function (SecurityConfig $security) {
        // ....
    
        $security->firewall('main')
            ->httpBasic()
                ->realm('Secured Area')
        ;
    };
    

Вот и все! Symfony теперь будет слушать любые данные аутентификации HTTP basic. Чтобы загрузить пользовательскую информацию, она будет использовать сконфигурированный вами поставщик пользователей.

Примечание: вы не можете использовать выход из системы с http_basic. Даже если вы выполните выход, ваш браузер “запоминает” ваши идентификационные данные, и отправляет их по каждому запросу.

Аутентификация сертификата клиента X.509

При использовании сертификатов клиента, ваш веб-сервер совершает весь процесс аутентификации самостоятельно. С Apache, к примеру, вы бы использовали директиву SSLVerifyClient Require.

Подключите аутентификацию x509 для конкретного брандмауэра в конфигурации безопасности:

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # config/packages/security.yaml
    security:
        # ...
    
        firewalls:
            main:
                # ...
                x509:
                    provider: your_user_provider
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!-- config/packages/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
            https://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/security
            https://symfony.com/schema/dic/security/security-1.0.xsd">
    
        <config>
            <!-- ... -->
    
            <firewall name="main">
                <!-- ... -->
                <x509 provider="your_user_provider"/>
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // config/packages/security.php
    use Symfony\Config\SecurityConfig;
    
    return static function (SecurityConfig $security) {
        // ....
    
        $security->firewall('main')
            // ...
            ->x509()
                ->provider('your_user_provider')
        ;
    };
    

По умолчанию, брандмауэр предоставляет переменную SSL_CLIENT_S_DN_Email поставщику пользователей, и устанавливает SSL_CLIENT_S_DN как идентификационные данные в PreAuthenticatedToken. Вы можете переопределить их, установив ключи user и credentials в конфигурации брандмауэра x509, соответственно.

Note

Поставщик аутентификации будет информировать поставщика пользователей только об имени пользователя, который сделал запрос. Вам нужно будет создать (или использовать) “поставщик пользователей”, на который ссылается параметр конфигурации provider (your_user_provider - в примере конфигурации). Этот поставщик преобразует имя пользователя в объект Пользователя по вашему выбору. Для более детальной информации о создании или конфигурации поставщика пользователей, см.:

Аутентификация, основанная на REMOTE_USER

Множество модулей аутентификации, вроде auth_kerb для Apache, предоставляют имя пользователя, используя переменную окружения REMOTE_USER. Этой переменной можно доверять приложение, так как аутентификация произошла до того, как запрос добрался до нее.

Чтобы сконфигурировать Symfony, использующую переменную окружения REMOTE_USER, включите соответствующий брандмауэр в вашей конфигурации безопасности:

  • YAML
    1
    2
    3
    4
    5
    6
    7
    # config/packages/security.yaml
    security:
        firewalls:
            main:
                # ...
                remote_user:
                    provider: your_user_provider
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <!-- config/packages/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
            https://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/security
            https://symfony.com/schema/dic/security/security-1.0.xsd">
    
        <config>
            <firewall name="main">
                <remote-user provider="your_user_provider"/>
            </firewall>
        </config>
    </srv:container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // config/packages/security.php
    use Symfony\Config\SecurityConfig;
    
    return static function (SecurityConfig $security) {
        $security->firewall('main')
            ->remoteUser()
                ->provider('your_user_provider')
        ;
    };
    

Затем брандмауэр предоставит переменную окружения REMOTE_USER вашему поставщику пользователей. Вы можете изменить имя используемой переменной, установив ключ user в конфигурации брандмауэра remote_user.

Note

Как и для аутентификации X509, вам нужно будет сконфигурировать “поставщика пользователей”. См. предыдущее примечание, чтобы узнать больше.

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