Redirecionar usuário anônimo para a página de login


14

Quero que se o usuário não estiver conectado e visitar qualquer página do meu site, exceto meus roteadores REST VIEWS, eu o redireciono para a página de login no drupal 8, encontrei essas soluções para o drupal 7, mas não encontrei nenhuma solução para o Drupal 8,


2
No código, você escreveria um assinante de evento para atuar no KernelEvents::REQUESTevento e, em seguida, definiria a resposta como RedirectResponse para a página de login.
Mclcliffe

1
Eu pensei em outra coisa. Você pode definir a página 403 /usere, se for anônima, seria necessário /user/login, mas com o efeito colateral de levar usuários autenticados ao seu perfil de usuário sem dizer a eles que foi negado o acesso à página que estavam procurando .
Mclcliffe

1
Use o módulo a seguir para adicionar um redirecionamento de logon para usuários anônimos. Ele possui uma configuração para excluir caminhos, portanto, acho que você pode adicionar seus caminhos de descanso. drupal.org/project/anonymous_redirect
Daniel Harper

1
Este módulo também faz o trabalho: drupal.org/project/anonymous_login
Joris Lucius

Respostas:


20

Você pode testar o status de um usuário muito cedo com o assinante de evento em um módulo personalizado que assina KernelEvents :: REQUEST.

Primeiro, você registra o assinante do evento na mymodule.services.ymlpasta do módulo:

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

Em seguida, adicione RedirectAnonymousSubscriber.php seu assinante de evento personalizado em seu módulo na /src/EventSubscriber/pasta

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

}

Graças a @mradcliffe para a idéia para o assinante do evento
oknate

1
ele deve criar RedirectAnonymousSubscriber.php, eu atualizo sua resposta.
Yusef

@oknate e se o usuário estiver na rota / registro ou / esquecer senha ou / logout? Não deveria verificar essas rotas também na condição if? Conforme isso, o usuário pode ser redirecionado enquanto se registra ou solicita a nova senha.
Juyal Jee 17/07/19

1
Outro detalhe importante aqui é a "prioridade" do assinante. Eu descobri que algumas rotas serão resolvidas antes que o redirecionamento acima comece. Mas definir a prioridade (um número maior é acionado primeiro) ajuda a resolver isso. No exemplo acima, use array ('checkAuthStatus', 100). Documentos sobre assinante e prioridade: symfony.com/doc/current/event_dispatcher.html
BWagner

6

No Drupal 8.3.3, esse código causa um redirecionamento infinito. Corrigi isso adicionando isso.

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

6

Primeiro, crie um serviço para o seu assinante de evento em module-name.services.yml

Código -

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

Crie sua própria classe eventsubscriber dentro do modules/module-name/src/EventSubscriberdiretório:

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;
  }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.