Я использую фреймворк symfony с FOS User Bundle.
У меня есть URL https://my-domain/article/view/articleId на моем веб-сайте для отображения содержимого статьи. Для этого URL-адреса у меня есть проверка безопасности с помощью ArticleVoter, которое выдает исключение AccessDenied Exception, если пользователь не вошел в систему.
(Вы можете спросить себя: «Почему я просто не поставил URL-адрес за своим основной брандмауэр? ". Поскольку для некоторых статей URL-адрес доступен для пользователей, не вошедших в систему, он зависит от некоторых атрибутов сущностей моих статей, и именно тогда появляется ArticleVoter, чтобы проверить эти атрибуты).
Затем у меня есть AccessDeniedSubscriber, который реализует EventSubscriberInterface и выглядит следующим образом (упрощенная версия для ясности):
public function onKernelException(GetResponseForExceptionEvent $event): void
{
$exception = $event->getException();
if ($exception instanceof AccessDeniedException && !self::isThrownByFirewall($exception)) {
$redirectRoute = 'my_login';
// Create your own response like in a custom access denied handler
$response = new RedirectResponse($this->router->generate($redirectRoute));
$event->setResponse($response);
$event->stopPropagation();
}
}
public static function getSubscribedEvents()
{
return [
// Define the priority to execute our subscriber before the one from the security component
KernelEvents::EXCEPTION => ['onKernelException', 1],
];
}
Итак, что происходит, когда анонимный (не подключенный) пользователь пытается для доступа к URL-адресу https://my-domain/article/view/articleId ArticleVoter выбрасывает AccessDeniedExpetion, метод голосования которого возвращает отказ в доступе, затем пользователь перенаправляется на маршрут my_login.
На моем маршруте входа , Я пытаюсь определить, с какого маршрута пользователь был перенаправлен изначально. Связанный метод контроллера для маршрута входа выглядит следующим образом:
public function loginAction(Request $request, AuthenticationUtils $authenticationUtils)
{
$referer = $request->headers->get('referer');
... handle login rendering ...
}
К сожалению, реферер всегда равен нулю. Что я понимаю, потому что это перенаправление на стороне сервера, а не перенаправление, вызванное щелчком по ссылке или javascript.
Итак, мой вопрос, как мне получить начальный URL-адрес, к которому пользователь пытался получить доступ до перенаправления на страницу входа? В моем случае это будет https://my-domain/article/view/articleId с правильным идентификатором статьи.
Точность: чтобы ответить на ответ @RyanNerd, найдите ниже результат var_dump ($ request-> headers ):
object(Symfony\Component\HttpFoundation\HeaderBag)#73 (2) { ["headers":protected]=> array(13) { ["host"]=> array(1) { [0]=> string(9) "localhost" } ["connection"]=> array(1) { [0]=> string(10) "keep-alive" } ["upgrade-insecure-requests"]=> array(1) { [0]=> string(1) "1" } ["user-agent"]=> array(1) { [0]=> string(121) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" } ["accept"]=> array(1) { [0]=> string(124) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" } ["sec-fetch-site"]=> array(1) { [0]=> string(4) "none" } ["sec-fetch-mode"]=> array(1) { [0]=> string(8) "navigate" } ["sec-fetch-user"]=> array(1) { [0]=> string(2) "?1" } ["sec-fetch-dest"]=> array(1) { [0]=> string(8) "document" } ["accept-encoding"]=> array(1) { [0]=> string(17) "gzip, deflate, br" } ["accept-language"]=> array(1) { [0]=> string(23) "fr,en-US;q=0.9,en;q=0.8" } ["cookie"]=> array(1) { [0]=> string(561) “MY_SESSION_NAME_SESS=qih0m4nlmi5enljsni5lphkf9m; sf_redirect=%7B%22token%22%3A%22821c13%22%2C%22route%22%3A%22article_view%22%2C%22method%22%3A%22GET%22%2C%22controller%22%3A%7B%22class%22%3A%22AllArticle%5C%5CWebBundle%5C%5CController%5C%5CArticle%5C%5CArticleController%22%2C%22method%22%3A%22viewAction%22%2C%22file%22%3A%22%5C%2FUsers%5C%2Fjohn_fly%5C%2FallArticle%5C%2Fsrc%5C%2FAllArticle%5C%2FWebBundle%5C%2FController%5C%2FArticle%5C%2FArticleController.php%22%2C%22line%22%3A244%7D%2C%22status_code%22%3A302%2C%22status_text%22%3A%22Found%22%7D" } ["x-php-ob-level"]=> array(1) { [0]=> string(1) "1" } } ["cacheControl":protected]=> array(0) { } }
Как видите, в значении 'cook ie' есть упоминание 'sf_redirect', возможно, есть способ получить предыдущий URL-адрес в качестве предыдущего маршрута. записано в этой строке ("% 22article_view%")?