Reindirizzare l'utente anonimo alla pagina di accesso


14

Voglio che l'utente non abbia effettuato l'accesso e visiti qualsiasi pagina del mio sito Web tranne i router RIEW VIEWS lo reindirizzo alla pagina di accesso in drupal 8, ho trovato queste soluzioni per drupal 7 ma non ho trovato alcuna soluzione per Drupal 8,


2
Nel codice scriverebbe un abbonato all'evento per agire KernelEvents::REQUESTsull'evento e quindi impostare la risposta su un RedirectResponse per la pagina di accesso.
mradcliffe,

1
Ho pensato a qualcos'altro. Puoi impostare la pagina 403 su /usere quindi se sono anonimi, li porterebbe a /user/login, ma con l'effetto collaterale di portare gli utenti autenticati al loro profilo utente senza dire loro che gli è stato negato l'accesso alla pagina che stavano cercando .
mradcliffe,

1
Usa il seguente modulo per aggiungere un reindirizzamento di accesso per utenti anonimi, ha un'impostazione per escludere percorsi quindi penso che puoi aggiungere i tuoi percorsi di riposo in quello. drupal.org/project/anonymous_redirect
Daniel Harper

1
Questo modulo fa anche il lavoro: drupal.org/project/anonymous_login
Joris Lucius,

Risposte:


21

Puoi testare lo stato di un utente molto presto con l'abbonato a un evento in un modulo personalizzato che si abbona a KernelEvents :: REQUEST.

Innanzitutto, registra l'abbonato all'evento nella mymodule.services.ymlcartella del tuo modulo:

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

Quindi aggiungi RedirectAnonymousSubscriber.php per il tuo abbonamento personalizzato all'evento nel tuo modulo nella /src/EventSubscriber/cartella.

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

}

grazie a @mradcliffe per l'idea per l'abbonato all'evento
oknate

1
dovrebbe creare RedirectAnonymousSubscriber.php, aggiorno la tua risposta.
Yusef,

@oknate cosa succede se l'utente si trova su / registrazione o / dimentica password o / percorso di disconnessione? Non dovrebbe controllare anche quei percorsi nelle condizioni if? In base a ciò, l'utente potrebbe essere reindirizzato durante la registrazione o la richiesta per la nuova password.
Juyal Jee,

2
Un altro dettaglio importante qui è la "priorità" dell'abbonato. Ho scoperto che alcuni percorsi si risolveranno prima che inizi il reindirizzamento sopra. Ma impostare la priorità (viene attivato un numero più elevato) aiuta a risolverlo. Nell'esempio sopra, usa array ('checkAuthStatus', 100). Documenti su abbonato e priorità: symfony.com/doc/current/event_dispatcher.html
BWagner

6

Su Drupal 8.3.3, questo codice provoca un reindirizzamento senza fine. L'ho risolto aggiungendolo invece.

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

6

Innanzitutto, crea un servizio per il tuo abbonato all'evento in module-name.services.yml

Codice -

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

Crea la tua classe eventsubscriber all'interno della modules/module-name/src/EventSubscriberdirectory:

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;
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.