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,
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;
}
}
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();
..
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;
}
}