익명 사용자를 로그인 페이지로 리디렉션


14

사용자가 로그인하지 않고 내 REST VIEWS 라우터를 제외하고 내 웹 사이트의 모든 페이지를 방문 하고 싶습니다 . drupal 8에서 로그인 페이지로 리디렉션합니다. drupal 7에 대한 솔루션을 찾았지만 Drupal 8에 대한 솔루션을 찾지 못했습니다.


2
코드에서는 이벤트 구독자가 이벤트에 대해 작업을 수행 KernelEvents::REQUEST한 다음 로그인 페이지에 대한 RedirectResponse로 응답을 설정합니다.
mradcliffe

1
나는 다른 것을 생각했다. 403 페이지를 /user익명으로 설정하면 익명 사용자 인 경우 403 페이지를 설정할 수 /user/login있지만 인증 된 사용자가 원하는 페이지에 대한 액세스가 거부되었음을 알리지 않고 사용자 프로필로 가져 오는 부작용이 있습니다. .
mradcliffe

1
다음 모듈을 사용하여 익명 사용자의 로그인 리디렉션을 추가하십시오. 경로를 제외하도록 설정되어 나머지 경로를 추가 할 수 있다고 생각합니다. drupal.org/project/anonymous_redirect
Daniel Harper

1
이 모듈은 또한 작업을 수행합니다. drupal.org/project/anonymous_login
Joris Lucius

답변:


21

KernelEvents :: REQUEST를 구독하는 사용자 지정 모듈에서 이벤트 구독자로 사용자의 상태를 매우 빨리 테스트 할 수 있습니다.

먼저 이벤트 구독자를 mymodule.services.yml모듈 폴더 에 등록하십시오 .

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

그런 다음 폴더 RedirectAnonymousSubscriber.php 의 모듈에서 사용자 정의 이벤트 구독자를 추가 하십시오 /src/EventSubscriber/.

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

}

이벤트 가입자를위한 아이디어를 주신 @mradcliffe에게 감사드립니다
oknate

1
그는 RedirectAnonymousSubscriber.php당신의 대답을 업데이트해야합니다.
Yusef

@oknate 사용자가 / registration 또는 / forget-password 또는 / logout 라우트에 있다면? if 조건에서도 해당 경로를 확인해야합니까? 이에 따라 사용자는 등록하거나 새 비밀번호를 요청하는 동안 리디렉션 될 수 있습니다.
Juyal Jee

2
여기서 또 다른 중요한 세부 사항은 가입자의 "우선 순위"입니다. 위의 경로 재 지정이 시작되기 전에 일부 경로가 해결되는 것을 발견했습니다. 그러나 우선 순위를 설정하면 (높은 숫자가 먼저 발생)이를 해결하는 데 도움이됩니다. 위의 예에서 array ( 'checkAuthStatus', 100)를 사용하십시오. 가입자 및 우선 순위에 대한 문서 : symfony.com/doc/current/event_dispatcher.html
BWagner

6

Drupal 8.3.3에서이 코드는 끝없는 리디렉션을 유발합니다. 대신 추가하여 수정했습니다.

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

6

먼저 이벤트 구독자를위한 서비스를 module-name.services.yml

코드 -

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

modules/module-name/src/EventSubscriber디렉토리 내에 자신의 eventsubscriber 클래스를 작성하십시오 .

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;
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.