Chcę przekierować anonimowego użytkownika do formularza logowania, jeśli taki użytkownik napotka błąd 403.
Utworzyłem subskrybenta zdarzenia i to jest mój kod, ale kończę na pętli na bieżącej stronie.
/**
* 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);
}
}
Myślę, że jest to związane z faktem, że odpowiedź zawiera już miejsce docelowe (bieżące URI), a system.404 i system.403 mają jakiś wysoki priorytet, który uniemożliwia mi to pominięcie.
8
routes
redirection
Pierre.Vriens
źródło
źródło
Odpowiedzi:
Widziałem, że na to pytanie nigdy nie udzielono odpowiedzi, jak to zrobić programowo. Kod faktycznie działa, gdy jest umieszczony w subskrybencie wyjątku:
/src/EventSubscriber/RedirectOn403Subscriber.php:
mymodule.services.yml:
źródło
Najprostszym sposobem jest, aby odszukać
/admin/config/system/site-information
i wypełnić pola, który odczytujeDefault 403 (access denied) page
zuser/login
źródło
Wystarczy spojrzeć na tytuł tego pytania (= Jak przekierować użytkownika do formularza logowania z 403? ), Istnieją 2 opcje, aby to zrobić bez żadnego niestandardowego kodu, jak opisano poniżej.
Opcja 1: Użyj modułu CustomError
CustomErrors moduł pozwala administratorowi witryny do tworzenia własnych stron błędów HTTP Kody statusu 403 (odmowa dostępu) oraz 404 (nie znaleziono), bez tworzenia węzłów dla każdego z nich. Kilka dodatkowych szczegółów na temat jego funkcji (ze strony projektu):
Prawdopodobnie zainteresuje Cię przede wszystkim część „ Użytkownicy, którzy nie są zalogowani i spróbują uzyskać dostęp do obszaru wymagającego zalogowania, zostaną przekierowani na stronę, do której próbowali uzyskać dostęp po zalogowaniu ”.
Dla D8 dostępna jest również wersja 8.x-1.x-dev dla tego modułu, więcej szczegółów na ten temat można znaleźć w numerze # 2219227 .
Opcja 2: użyj modułu Reguły
Załóżmy, że ścieżka strony „Domyślne 403” jest ustawiona na
no_access
(przez administratora). Następnie utwórz regułę za pomocą modułu Reguły , używając jako zdarzenia czegoś takiego jak „Po odwiedzeniu węzłano_access
”. Aby cała reguła wyglądała mniej więcej tak:no_access
Warunki:
Parameter: User: [site:current-user], Roles: anonymous user
Parameter: Text: [site:current-page:url], Matching text: user/login
Działania: Przekierowanie strony -
Parameter: URL: user/login
Jeśli chcesz to zrobić, możesz nawet dodać kolejną akcję, aby wyświetlić również (informacyjną) wiadomość w obszarze wiadomości Drupal, na przykład „Próbowałeś odwiedzić stronę, dla której wymagane jest logowanie ...”.
To prawda, że może wymagać włączenia dodatkowego modułu ( Reguły ). Ale, jak wskazuje jego rosnąca popularność, moduł ten prawdopodobnie jest już włączony w większości witryn (podobnie jak moduł Widoki ), ponieważ istnieją dziesiątki przypadków użycia tego modułu.
W przypadku D8 dostępna jest również wersja 8.x-3.x-alfa1 dla tego modułu, więcej szczegółów na temat jego wersji D8 można znaleźć w numerze 2574691 , który zawiera link do wydania regulaminu „ Plan działania 8.x ”
Jeśli powyższe nie pomoże, możesz sprawdzić, czy nie można zapobiec / wyjaśnić przyczyny swojej pętli (lub „wysokiego priorytetu” jak w pytaniu) przez odpowiedź podobną do odpowiedzi na pytanie „ Jak określić wydarzenie Zasad, takie jak „Treść” będzie „oglądana”? ”.
źródło
Myślę, że rozwiązanie twojego problemu jest proste. Możesz łatwo utworzyć niestandardową stronę,
404
a403
następnie wewnątrz tej strony, przekierować anonimowych użytkowników na/user
stronę.Możesz użyć tego kodu
Ilekroć wystąpi 404,
page--404.tpl.php
zostaniesz wykorzystany. Na tej stronie użyj tego koduJak zwyczaj 403 i 404 w Drupal wyjaśnia inną metodę tworzenia strony dla
403
i404
.źródło
8
formatNajprostszym sposobem na to jest skorzystanie z modułu Przekieruj 403 na login użytkownika (istnieje jego wersja deweloperska dla D8). Oto cytat na ten temat (ze strony projektu):
źródło
7
i6
(1) utwórz węzeł strony z aliasem takim jak „/my403.html”
(2) przejdź do / admin / config / system / site-information i ustaw „/my403.html” jako stronę błędu 403
(3) przejdź do / admin / structure / block i dodaj blok „User login” (Sec. Forms) do głównego regionu zawartości. Ogranicz wygląd bloku do strony „my403.html” i roli „gość”.
Otóż to.
Jeśli potrzebujesz większej kontroli, utwórz kontroler dla swojej strony 403 i ręcznie dodaj UserLoginForm.
Z pozdrowieniami, Rainer
źródło