У меня есть такая задача. Нужно после того как пользователь выходит из приложения перенаправить его на ту страницу на которой он нажал кнопу "Выход", но предварительно нужно проверить имеют ли анонимные пользователи к этой странице доступ, если не имеет то перенаправить на главную страницу.
После авторизации пользователя я могу без проблем перекинуть его на страницу из параметра или заголовка referer:
public function index(Request $request):RedirectResponse
{
// ... authenticate
$referer = $request->request->get('referer') ?? $request->headers->get('referer');
if($referer === null){
$this->redirectToRoute('main');
}
return new RedirectResponse($referer);
}
И при этом никаких проблем не будет, ведь если страница на которой был пользователь доступна анониму, то и авторизованному пользователю она тоже будет доступна, но если я попытаюсь в контроллере выхода из приложения перенаправить на url который в referer или например в get параметре, то пользователь может попасть на страницу которая доступна только авторизованному пользователю. Т.е. перед тем как решить куда перенаправлять пользователя мне нужно проверить доступна ли url из заголовка referer для анонимного пользователя.
В идеале решение должно выглядеть примерно так:
public function index(
Request $request,
RouteMatcherInterface $routeMatcher,
):RedirectResponse
{
// ... exit
$referer = $request->headers->get('referer');
if($referer === null){
$this->redirectToRoute('main');
}
if($routeMatcher->has($referer)){
$router = $routeMatcher->get($referer);
/**
* $router->getName(); // string
* $router->getParameters(); // array
* $router->isGranted('IS_AUTHENTICATED_ANONYMOUSLY'); // bool
*/
if($router->isGranted('IS_AUTHENTICATED_ANONYMOUSLY')){
new RedirectResponse($referer);
}
}
return $this->redirectToRoute('main');
}
Но покопавшись в интернете ничего толком не нашёл, а покопавшись в исходниках symfony решения приходящие в голову слишком сложные. Хотелось бы не придумывать велосипеды.