Rediriger l'utilisateur anonyme vers la page de connexion

14

Je veux que si l'utilisateur n'est pas connecté et visite n'importe quelle page de mon site Web à l' exception de mes routeurs REST VIEWS, je le redirige vers 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,

David Mcsmith
la source
2
Dans le code, vous écririez un abonné à l'événement pour agir sur l' KernelEvents::REQUESTévénement, puis définiriez la réponse sur une RedirectResponse pour la page de connexion.
mradcliffe
1
J'ai pensé à autre chose. Vous pouvez définir la page 403 sur /userpuis s'ils sont anonymes, cela les amènera à /user/login, mais avec pour effet secondaire de prendre les utilisateurs authentifiés sur leur profil d'utilisateur sans leur dire qu'ils se sont vu refuser l'accès à la page qu'ils recherchaient .
mradcliffe
1
Utilisez le module suivant pour ajouter une redirection de connexion pour les utilisateurs anonymes, il a un paramètre pour exclure les chemins, donc je pense que vous pouvez ajouter vos chemins de repos. drupal.org/project/anonymous_redirect
Daniel Harper
1
Ce module fait également le travail: drupal.org/project/anonymous_login
Joris Lucius

Réponses:

21

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 enregistrez l'abonné à l'événement mymodule.services.ymldans votre dossier de module:

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

Ajoutez ensuite RedirectAnonymousSubscriber.php pour votre abonné é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;
  }

}
oknate
la source
merci à @mradcliffe pour l'idée de l'abonné de l'événement
oknate
1
il devrait créer RedirectAnonymousSubscriber.php, je mets à jour votre réponse.
Yusef
@oknate que se passe-t-il si l'utilisateur est sur / inscription ou / oublier-mot de passe ou / déconnexion? Ne devrait-il pas également vérifier ces itinéraires dans l'état if? Conformément à cela, l'utilisateur peut être redirigé lors de son inscription ou demander le nouveau mot de passe.
Juyal Jee
2
Un autre détail important ici est la "priorité" de l'abonné. J'ai trouvé que certains itinéraires se résoudront avant que la redirection ci-dessus ne se déclenche. Mais la définition de la priorité (un nombre plus élevé se déclenche en premier) aide à résoudre ce problème. Dans l'exemple ci-dessus, utilisez array ('checkAuthStatus', 100). Documents sur l'abonné et la priorité: symfony.com/doc/current/event_dispatcher.html
BWagner
6

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();
..
GH
la source
6

Créez d'abord un service pour votre abonné à l'événement 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 le modules/module-name/src/EventSubscriberré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;
  }
}
Ashish Deynap
la source