Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Запомнить меня, сброс пароля, подтверждение почты

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

Запомнить меня

# config/packages/security.yaml
security:
    firewalls:
        main:
            remember_me:
                secret: '%kernel.secret%'
                lifetime: 604800

В форму входа добавьте флажок с именем _remember_me:

<label>
    <input type="checkbox" name="_remember_me"> Запомнить меня
</label>

Пользователь останется вошедшим на неделю (604800 секунд), даже закрыв браузер.

Полный вход для важных действий

Вход по cookie «запомнить меня» слабее входа с паролем: ноутбуком мог воспользоваться кто-то другой. Для смены пароля и оплаты требуют полного входа:

#[Route('/account/password', name: 'account_password')]
#[IsGranted('IS_AUTHENTICATED_FULLY')]
public function changePassword(): Response
{
    // …
}
ПризнакКто проходит
IS_AUTHENTICATED_REMEMBEREDЛюбой вошедший пользователь
IS_AUTHENTICATED_FULLYТолько вошедший с паролем в этой сессии
PUBLIC_ACCESSВсе, включая гостей

Ограничение попыток входа

composer require symfony/rate-limiter
security:
    firewalls:
        main:
            login_throttling:
                max_attempts: 5
                interval: '15 minutes'

После пяти неудачных попыток вход с этого адреса и для этого имени блокируется на 15 минут.

Подтверждение почты

composer require symfonycasts/verify-email-bundle
php bin/console make:registration-form

На вопрос о подтверждении почты ответьте «да»: команда создаст отправку письма со ссылкой и маршрут, который её проверяет. Ссылка подписана, поэтому подделать её нельзя.

Сброс пароля

composer require symfonycasts/reset-password-bundle
php bin/console make:reset-password

Появятся страницы «Забыли пароль?», письмо со ссылкой и форма нового пароля. Ссылка действует ограниченное время и срабатывает один раз.

Вход от имени пользователя

Чтобы увидеть сайт глазами пользователя, администратору не нужен его пароль:

security:
    firewalls:
        main:
            switch_user: true

Адрес /profile?_switch_user=anna@example.com переключает на пользователя, ?_switch_user=_exit возвращает обратно. Право на это даёт роль ROLE_ALLOWED_TO_SWITCH.

Выход

security:
    firewalls:
        main:
            logout:
                path: app_logout
                target: home

Частая ошибка

Страница «Забыли пароль?» не должна сообщать, зарегистрирован ли адрес: фраза «Такой почты нет» позволяет собрать список пользователей. Отвечайте одинаково в обоих случаях — «Если адрес зарегистрирован, мы отправили письмо». Пакет reset-password-bundle ведёт себя именно так.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.