Redireccionar usuario anónimo a la página de inicio de sesión

14

Quiero que si el usuario no ha iniciado sesión y visita alguna página de mi sitio web, excepto mis enrutadores REST VIEWS , lo redirijo a la página de inicio de sesión en drupal 8, encontré estas soluciones para drupal 7 pero no encontré ninguna solución para Drupal 8,

David Mcsmith
fuente
2
En el código, escribiría un suscriptor de evento para actuar en el KernelEvents::REQUESTevento y luego establecería la respuesta a una Respuesta de redireccionamiento para la página de inicio de sesión.
mradcliffe
1
Pensé en otra cosa. Puede configurar la página 403 /usery luego, si son anónimos, los llevará /user/login, pero con el efecto secundario de llevar a los usuarios autenticados a su perfil de usuario sin decirles que se les ha denegado el acceso a la página que estaban buscando. .
mradcliffe
1
Use el siguiente módulo para agregar una redirección de inicio de sesión para usuarios anónimos, tiene una configuración para excluir rutas, por lo que creo que puede agregar sus rutas de descanso en eso. drupal.org/project/anonymous_redirect
Daniel Harper
1
Este módulo también hace el trabajo: drupal.org/project/anonymous_login
Joris Lucius

Respuestas:

21

Puede probar el estado de un usuario muy temprano con el suscriptor de eventos en un módulo personalizado que se suscribe a KernelEvents :: REQUEST.

Primero, registra el suscriptor del evento mymodule.services.ymlen la carpeta de su módulo:

services:
  mymodule.event_subscriber:
    class: Drupal\mymodule\EventSubscriber\RedirectAnonymousSubscriber
    arguments: []
    tags:
      - {name: event_subscriber}

Luego agregue RedirectAnonymousSubscriber.php para su suscriptor de evento personalizado en su módulo en la /src/EventSubscriber/carpeta.

namespace Drupal\mymodule\EventSubscriber;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Event subscriber subscribing to KernelEvents::REQUEST.
 */
class RedirectAnonymousSubscriber implements EventSubscriberInterface {

  public function __construct() {
    $this->account = \Drupal::currentUser();
  }

  public function checkAuthStatus(GetResponseEvent $event) {

    if ($this->account->isAnonymous() && \Drupal::routeMatch()->getRouteName() != 'user.login') {

      // add logic to check other routes you want available to anonymous users,
      // otherwise, redirect to login page.
      $route_name = \Drupal::routeMatch()->getRouteName();
      if (strpos($route_name, 'view') === 0 && strpos($route_name, 'rest_') !== FALSE) {
        return;
      }

      $response = new RedirectResponse('/user/login', 301);
      $event->setResponse($response);
      $event->stopPropagation();
    }
  }

  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('checkAuthStatus');
    return $events;
  }

}
oknate
fuente
gracias a @mradcliffe por la idea para el suscriptor del evento
oknate
1
él debería crear RedirectAnonymousSubscriber.php, actualizo tu respuesta.
Yusef
@oknate ¿qué pasa si el usuario está en / registro o / olvidar-contraseña o / ruta de cierre de sesión? ¿No debería comprobar también esas rutas en la condición if? Según esto, el usuario puede ser redirigido mientras se registra o solicita la nueva contraseña.
Juyal Jee
2
Otro detalle importante aquí es la "prioridad" del suscriptor. Descubrí que algunas rutas se resolverán antes de que comience la redirección anterior. Pero establecer la prioridad (primero se dispara un número mayor) ayuda a resolver eso. En el ejemplo anterior, use array ('checkAuthStatus', 100). Documentos sobre suscriptores y prioridad: symfony.com/doc/current/event_dispatcher.html
BWagner
6

En Drupal 8.3.3, este código provoca una redirección sin fin. Lo arreglé agregando eso en su lugar.

..
$response = new RedirectResponse('/user/login', 301);
$response->send();
..
GH
fuente
6

Primero, cree un servicio para su suscriptor de eventos en module-name.services.yml

código -

services:
    [MODULE-NAME]_event_subscriber:
        class: Drupal\MODULE-NAME\EventSubscriber\[Event-Subscriber-class]
        tags:
        - {name: event_subscriber}

Cree su propia clase de suscriptor de eventos dentro del modules/module-name/src/EventSubscriberdirectorio:

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class Event-Subscriber-class implements EventSubscriberInterface {

  private $redirectCode = 301;

  public function checkForRedirection2(GetResponseEvent $event) {
    $account = \Drupal::currentUser(); 
    if (empty($account->id()) {
      $response = new RedirectResponse('/', $this->redirectCode);
      $response->send();
      exit(0);
    }
  }

  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('checkForRedirection2');
    return $events;
  }
}
Ashish Deynap
fuente