web-dev-qa-db-fra.com

Rediriger l'utilisateur anonyme vers la page de connexion

Je veux que si l'utilisateur n'est pas connecté et visite n'importe quelle page de mon site Web sauf mes REST routeurs VIEWS je le redirige/elle à la page de connexion dans drupal 8, j'ai trouvé ces solutions pour drupal 7 mais je n'ai trouvé aucune solution pour Drupal = 8,

14
David Mcsmith

Vous pouvez tester très tôt le statut d'un utilisateur avec un abonné aux événements dans un module personnalisé qui s'abonne à KernelEvents :: REQUEST.

Tout d'abord, vous inscrivez l'abonné à l'événement dans mymodule.services.yml dans le dossier de votre module:

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

Puis ajouter RedirectAnonymousSubscriber.php pour votre abonné d'événement personnalisé dans votre module dans le /src/EventSubscriber/ dossier.

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;
  }

}
21
oknate

Sur Drupal 8.3.3, ce code provoque une redirection sans fin. J'ai corrigé cela en l'ajoutant à la place.

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

Créez d'abord un service pour votre abonné à l'événement dans module-name.services.yml

Code -

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

Créez votre propre classe eventsubscriber dans modules/module-name/src/EventSubscriber répertoire:

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;
  }
}
6
Ashish Deynap