Запомнить меня, сброс пароля, подтверждение почты
Форма входа — только начало. Настоящему сайту нужно помнить пользователя между посещениями, защищаться от подбора пароля, подтверждать адрес почты и восстанавливать забытый пароль. Почти всё это в 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-limitersecurity:
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 ведёт себя именно так.