В Symfony для осуществления переадресации пользователя на ранее запрошенный ресурс после авторизации вы можете использовать механизм сохранения запрашиваемого URL адреса в сеансе пользователя.
Чтобы это сделать, вам сначала необходимо настроить сервис SecurityBundle в файле конфигурации security.yaml
. Найдите секцию firewalls
и внутри активной конфигурации отредактируйте параметр form_login
, добавив опцию use_referer: true
:
security: # ... firewalls: main: # ... form_login: # ... use_referer: true
Теперь, после успешной аутентификации пользователя, Symfony будет автоматически перенаправлять его на URL, сохраненный в сеансе. Для сохранения запрашиваемого URL, убедитесь, что в вашем контроллере после успешной аутентификации вы вызываете метод setTargetUrl()
объекта RedirectResponse
:
use SymfonyComponentHttpFoundationRedirectResponse; use SymfonyComponentSecurityHttpAuthenticationAuthenticationUtils; class SecurityController extends AbstractController { public function login(AuthenticationUtils $authenticationUtils): Response { // Получаем ошибки аутентификации (если есть) $error = $authenticationUtils->getLastAuthenticationError(); // Получаем последнее имя пользователя, введенное пользователем $lastUsername = $authenticationUtils->getLastUsername(); // Если авторизация успешна, проверяем сохраненный URL if ($this->getUser()) { // Получаем вызывающий URL из сеанса $refererUrl = $this->get('session')->get('_security.main.target_path'); // Если URL не пустой и является относительным, перенаправляем пользователя if ($refererUrl && substr($refererUrl, 0, 1) === '/') { return new RedirectResponse($refererUrl); } // Если URL не определен или является абсолютным, перенаправляем на главную страницу return $this->redirectToRoute('home'); } // Выводим форму авторизации return $this->render('security/login.html.twig', [ 'last_username' => $lastUsername, 'error' => $error, ]); } }
Теперь, когда пользователь прошел аутентификацию, он будет автоматически перенаправлен на запрашиваемый ресурс или на главную страницу, если запрашиваемый URL неопределен или является абсолютным. Обратите внимание, что для доступа к сеансу get('_security.main.target_path')
мы используем контейнер внедрения зависимостей $this->get('session')
, но это может потребовать некоторых изменений в версиях Symfony 4 и выше.
Надеюсь, эта информация поможет вам осуществить перенаправление пользователя на ранее запрошенный ресурс после авторизации в Symfony.