Quiero redirigir a un usuario anónimo al formulario de inicio de sesión si dicho usuario encuentra un error 403.
He creado un suscriptor de eventos y este es mi código, pero termino en bucle en la página actual.
/**
* 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);
}
}
Creo que esto está relacionado con el hecho de que la respuesta ya contiene el destino (uri actual) y system.404 y system.403 tienen una alta prioridad que me impide anular esto.
8
routes
redirection
Pierre.Vriens
fuente
fuente
Respuestas:
He visto que esta pregunta nunca fue respondida cómo hacer esto mediante programación. El código realmente funciona, cuando se coloca en un suscriptor de excepción:
/src/EventSubscriber/RedirectOn403Subscriber.php:
mymodule.services.yml:
fuente
La forma más fácil es navegar
/admin/config/system/site-information
y completar el campo que leeDefault 403 (access denied) page
conuser/login
fuente
Simplemente mirando el título de esta pregunta (= ¿Cómo redirigir al usuario al formulario de inicio de sesión desde 403? ), Hay 2 opciones para hacerlo, sin ningún código personalizado, como se detalla a continuación.
Opción 1: usar el módulo CustomError
El módulo CustomError permite al administrador del sitio crear páginas de error personalizadas para los códigos de estado HTTP 403 (acceso denegado) y 404 (no encontrado), sin crear nodos para cada uno de ellos. Algunos detalles más sobre sus características (de su página de proyecto):
Probablemente le interesará principalmente la parte sobre " Los usuarios que no han iniciado sesión e intentan acceder a un área que requiere inicio de sesión serán redirigidos a la página a la que intentaban acceder después de iniciar sesión ".
Para D8 hay una versión 8.x-1.x-dev disponible para este módulo también disponible, se pueden encontrar más detalles al respecto en el número 2219227 .
Opción 2: usar el módulo Reglas
Suponga que la ruta de la página "403 predeterminada" está establecida en
no_access
(a través de admin). Luego cree una regla usando el módulo Reglas , con un evento como "Después de visitar el nodono_access
". Para que toda la regla se vea así:no_access
Condiciones:
Parameter: User: [site:current-user], Roles: anonymous user
Parameter: Text: [site:current-page:url], Matching text: user/login
Acciones: redireccionamiento de página -
Parameter: URL: user/login
Si desea hacerlo, incluso podría agregar otra Acción para mostrar también algún mensaje (informativo) en el área de mensajes de Drupal, con algo como "Intentó visitar una página para la que es necesario iniciar sesión ...".
Es cierto que puede requerir que habilite un módulo contribuido adicional ( Reglas ). Pero, como lo indica su creciente popularidad también, ese módulo probablemente ya esté habilitado en casi cualquier sitio (similar al módulo Vistas ), porque hay docenas de casos de uso para este módulo.
Para D8 hay una versión 8.x-3.x-alfa1 disponible para este módulo también, se pueden encontrar más detalles sobre su versión D8 en el número 2574691 , que incluye un enlace a la cuestión de reglas " Hoja de ruta de las reglas 8.x "
Si lo anterior no ayuda, es posible que desee verificar si el motivo de su ciclo (o "alguna prioridad alta" como en su pregunta) no puede evitarse / explicarse por algo similar a la respuesta a la pregunta " Cómo especificar un evento de Reglas como "¿El contenido se 'va a ver'? ".
fuente
Supongo que la solución a su problema es simple. Puede crear fácilmente una página personalizada para,
404
y403
luego dentro de esta página, redirigir a los usuarios anónimos a la/user
página.Puedes usar este código
Siempre que ocurra 404 se
page--404.tpl.php
usará tu . En esta página usa este códigoLa página Cómo crear páginas 403 y 404 personalizadas en Drupal explica otro método para crear una página para
403
y404
.fuente
8
formatoLa forma más fácil de hacerlo es usar el módulo Redirect 403 to User Login (existe una versión dev para D8). Aquí hay una cita al respecto (de su página de proyecto):
fuente
7
y6
(1) cree un nodo de página con un alias como "/my403.html"
(2) vaya a / admin / config / system / site-information y configure "/my403.html" como 403-Errorpage
(3) vaya a / admin / structure / block y agregue el bloque "User login" (Sec. Forms) a la región de contenido principal. Restrinja la apariencia del bloque a la página "my403.html" y al rol "invitado".
Eso es.
Si necesita más control, cree un controlador para su página 403 y agregue el UserLoginForm a mano.
Saludos cordiales, Rainer
fuente