Как настроить вашу форму входа в систему

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

Справочник конфигурации формы входа в систему

Чтобы увидеть полный справочник конфигурации формы входа, смотрите Security Configuration Reference (SecurityBundle). Некоторые наиболее интересные опции раскрываются ниже.

Перенаправление после успеха

Вы можете изменить то, куда форма входа перенавпрялет после успешного входа в систему, используя разнообразные опции конфигурации. По умолчанию, форма будет перенаправлять на URL, запрошенный пользователем (т.е. URL, который вызвал отображение формы входа). Например, если пользователь запросил http://www.example.com/admin/post/18/edit, то после успешного входа в систему, он будет в итоге отправлен обратно на http://www.example.com/admin/post/18/edit. Это делается путём сохранения запрошенного URL в сессии. Если в сессии нет URL (возможно, пользователь сразу зашёл на страницу входа в систему), тогда пользователь будет перенаправлен на страницу по умолчанию - по умолчанию / (т.е. домашняя страница). Вы можете изменить это поведение несколькими путями.

Изменение страницы по умолчанию

Для начала, страница по умолчанию может быть установлена (т.е. страница, на которую перенаправляется ползователь, если в сессии не была сохранена предыдущая страница). Чтобы устноавить её в маршруте default_security_target, используйте следующую конфигурацию:

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            main:
                form_login:
                    # ...
                    default_target_path: default_security_target
    
  • 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="main">
                <form-login default-target-path="default_security_target" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'firewalls' => array(
            'main' => array(
                // ...
    
                'form_login' => array(
                    // ...
                    'default_target_path' => 'default_security_target',
                ),
            ),
        ),
    ));
    

Теперь, когда в сессии не установлен никакой URL, пользователи будут отправлены по маршруту default_security_target.

Всегда перенаправлять на страницу по умолчанию

Вы можете сделать так, чтобы пользователи всегда перенаправлялись на страницу по умолчанию, независимо от того, какой URL они запросили ранее, установив опцию always_use_default_target_path в значение "true":

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            main:
                form_login:
                    # ...
                    always_use_default_target_path: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- 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="main">
                <!-- ... -->
                <form-login always-use-default-target-path="true" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'firewalls' => array(
            'main' => array(
                // ...
    
                'form_login' => array(
                    // ...
                    'always_use_default_target_path' => true,
                ),
            ),
        ),
    ));
    

Использование URL обращения

В случае, если предыдущий URL хранился в сессии, вы можете захотеть попробовать использовать вместо него HTTP_REFERER, так как они часто будут совпадать. Вы можете сделать это, установив use_referer в значение "true" (по умолчанию - "false"):

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            main:
                # ...
                form_login:
                    # ...
                    use_referer: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- 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="main">
                <!-- ... -->
                <form-login use-referer="true" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'firewalls' => array(
            'main' => array(
                // ...
                'form_login' => array(
                    // ...
                    'use_referer' => true,
                ),
            ),
        ),
    ));
    

Перенаправление при неудаче входа в систему

После неудачного входа в систему (например, был отправлен неправильный пароль или имя пользователя), пользователь перенаправляется обратно к самой форме входа. Используйте опцию failure_path, чтобы определить маршрут URL, по которому будет перенаправлен пользовтель:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            main:
                # ...
                form_login:
                    # ...
                    failure_path: login_failure
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- 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="main">
                <!-- ... -->
                <form-login failure-path="login_failure" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'firewalls' => array(
            'main' => array(
                // ...
                'form_login' => array(
                    // ...
                    'failure_path' => 'login_failure',
                ),
            ),
        ),
    ));
    

Контролируйте URL перенаправления изнутри формы

Вы также можете переопределить то, куда будет перенаправлен пользователь, через саму форму, включив скрытое поле с именем _target_path для успешных входов в систему, и _failure_path - для неудачных:

  • Twig
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    {# src/AppBundle/Resources/views/Security/login.html.twig #}
    {% if error %}
        <div>{{ error.message }}</div>
    {% endif %}
    
    <form action="{{ path('login') }}" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="_username" value="{{ last_username }}" />
    
        <label for="password">Password:</label>
        <input type="password" id="password" name="_password" />
    
        <input type="hidden" name="_target_path" value="account" />
        <input type="hidden" name="_failure_path" value="login" />
    
        <input type="submit" name="login" />
    </form>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!-- src/AppBundle/Resources/views/Security/login.html.php -->
    <?php if ($error): ?>
        <div><?php echo $error->getMessage() ?></div>
    <?php endif ?>
    
    <!-- Метод path() был представлен в Symfony 2.8. До версии 2.8, вы должны
         были использовать generate(). -->
    <form action="<?php echo $view['router']->path('login') ?>" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="_username" value="<?php echo $last_username ?>" />
    
        <label for="password">Password:</label>
        <input type="password" id="password" name="_password" />
    
        <input type="hidden" name="_target_path" value="account" />
        <input type="hidden" name="_failure_path" value="login" />
    
        <input type="submit" name="login" />
    </form>
    

Теперь пользователь будет перенаправлен по значению скрытого поля формы. Атрибут значения может быть относительным путём, абсолютным URL или именем маршрута. Имя скрытых полей в форме входа также можно настроить, используя опции брандмауэра target_path_parameter и failure_path_parameter.

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            main:
                # ...
                form_login:
                    target_path_parameter: login_success
                    failure_path_parameter: login_fail
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!-- 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="main">
                <!-- ... -->
                <form-login target-path-parameter="login_success" />
                <form-login failure-path-parameter="login_fail" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    // app/config/security.php
    $container->loadFromExtension('security', array(
        // ...
    
        'firewalls' => array(
            'main' => array(
                // ...
                'form_login' => array(
                    'target_path_parameter' => 'login_success',
                    'failure_path_parameter' => 'login_fail',
                ),
            ),
        ),
    ));
    

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