Я хочу перенаправить анонимного пользователя в форму входа, если такой пользователь обнаружит ошибку 403.
Я создал подписчика на события, и это мой код, но я попал в цикл на текущей странице.
/**
* Redirect anonymous user to login page if he encounters 404 or 403
* response.
*
* @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $response
* The created response object that will be returned.
* @param string $event
* The string representation of the event.
* @param \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher
* Event dispatcher that lazily loads listeners and subscribers from the dependency injection
* container.
*/
public function checkLoginNeeded(GetResponseEvent $response, $event, ContainerAwareEventDispatcher $event_dispatcher) {
$routeMatch = RouteMatch::createFromRequest($response->getRequest());
$route_name = $routeMatch->getRouteName();
$is_anonymous = \Drupal::currentUser()->isAnonymous();
$is_not_login = $route_name != 'user.login';
if ($is_anonymous && $route_name == 'system.403' && $is_not_login) {
$query = $response->getRequest()->query->all();
// $query['destination'] = $routeMatch->getRouteObject()->getPath();
$query['destination'] = \Drupal::url('<current>');
$login_uri = \Drupal::url('user.login', [], ['query' => $query]);
$returnResponse = new RedirectResponse($login_uri, Response::HTTP_FOUND);
$response->setResponse($returnResponse);
}
}
Я думаю, что это связано с тем фактом, что ответ уже содержит пункт назначения (текущий uri), а system.404 и system.403 имеют высокий приоритет, который мешает мне переопределить это.
8
routes
redirection
Pierre.Vriens
источник
источник
Ответы:
Я видел, что на этот вопрос никогда не отвечали, как это сделать программно. Код на самом деле работает, когда размещен в Exception Subscriber:
/src/EventSubscriber/RedirectOn403Subscriber.php:
mymodule.services.yml:
источник
Самый простой способ - найти
/admin/config/system/site-information
и заполнить полеDefault 403 (access denied) page
с надписьюuser/login
источник
Просто глядя на заголовок этого вопроса (= Как перенаправить пользователя на форму входа из 403? ), Есть 2 варианта сделать это без какого-либо специального кода, как описано ниже.
Вариант 1. Используйте модуль CustomError
Модуль CustomError позволяет администратору сайта создавать настраиваемые страницы ошибок для кодов состояния HTTP 403 (доступ запрещен) и 404 (не найден) без создания узлов для каждого из них. Еще несколько подробностей о его функциях (со страницы проекта):
Вероятно, вас заинтересует в основном часть « Пользователи, которые не вошли в систему и пытаются получить доступ к области, требующей входа в систему, будут перенаправлены на страницу, к которой они пытались получить доступ после входа в систему ».
Для D8 также доступна версия 8.x-1.x-dev для этого модуля, более подробную информацию об этом можно найти в выпуске # 2219227 .
Вариант 2. Использование модуля «Правила»
Предположим, что путь к странице «Default 403» установлен
no_access
(через администратора). Затем создайте правило, используя модуль « Правила », в качестве события укажите что-то вроде «После посещения узлаno_access
». Чтобы все правило выглядело примерно так:no_access
условия:
Parameter: User: [site:current-user], Roles: anonymous user
Parameter: Text: [site:current-page:url], Matching text: user/login
Действия: перенаправление страницы -
Parameter: URL: user/login
Если вы захотите это сделать, вы можете даже добавить другое действие, чтобы также отображать некоторые (информационные) сообщения в области сообщений Drupal, например, «Вы пытались посетить страницу, для которой требуется вход в систему ...».
Правда, для этого может потребоваться включить дополнительный модуль ( Правила ). Но, как показывает его растущая популярность, этот модуль, вероятно, уже включен практически на любом сайте (аналогично модулю Views ), поскольку для этого модуля существуют десятки вариантов использования.
Для D8 также доступна версия 8.x-3.x-alfa1 для этого модуля, более подробную информацию о его версии D8 можно найти в выпуске № 2574691 , который включает ссылку на выпуск правил « Правила 8.x Roadmap »
Если вышеупомянутое не помогает, тогда вы можете проверить, не может ли быть предотвращена / объяснена причина вашего цикла (или «какой-то высокий приоритет», как в вашем вопросе) чем-то похожим на ответ на вопрос « Как указать Событие правил, такое как «Контент будет« просматриваться »? ».
источник
Я думаю, что решение вашей проблемы простое. Вы можете легко создать пользовательскую страницу для
404
и403
затем внутри этой страницы, перенаправить анонимных пользователей на/user
страницу.Вы можете использовать этот код
Всякий раз, когда 404 происходит, вы
page--404.tpl.php
будете использованы. На этой странице используйте этот кодКак сделать заказ 403 и 404 страницы в Drupal объясняет другой способ создания страницы для
403
и404
.источник
8
форматСамый простой способ сделать это - использовать модуль Redirect 403 to User Login (его версия для D8 существует). Вот цитата об этом (со страницы проекта):
источник
7
и6
(1) создайте узел страницы с псевдонимом типа "/my403.html"
(2) перейдите в / admin / config / system / site-information и установите "/my403.html" как страницу ошибки 403
(3) перейдите в / admin / structure / block и добавьте блок «User login» (раздел форм) в область основного контента. Ограничьте внешний вид блока страницей "my403.html" и ролью "guest".
Вот и все.
Если вам нужно больше контроля, создайте контроллер для вашей страницы 403 и вручную добавьте UserLoginForm.
С наилучшими пожеланиями, Райнер
источник