匿名ユーザーをログインページにリダイレクトする


14

ユーザーがログインせずに、REST VIEWSルーター以外の Webサイトのページにアクセスしたい場合、Drupal 8のログインページにリダイレクトしますが、Drupal 7のこのソリューションは見つかりましたが、Drupal 8のソリューションは見つかりませんでした


2
コードでは、イベントで動作するイベントサブスクライバーを記述KernelEvents::REQUESTし、ログインページのRedirectResponseに応答を設定します。
mradcliffe

1
私は何か他のものを考えました。403ページをに設定し、/user匿名の場合はに移動します/user/loginが、認証されたユーザーを探しているページへのアクセスが拒否されたことを通知せずにユーザープロファイルに移動するという副作用があります。
mradcliffe 16

1
次のモジュールを使用して匿名ユーザーのログインリダイレクトを追加します。パスを除外する設定があるため、その中に残りのパスを追加できると思います。drupal.org/project/anonymous_redirect
ダニエルハーパー

1
このモジュールは次の役割
Joris Lucius

回答:


20

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、私はあなたの答えを更新します。
ユセフ

@oknateユーザーが/ registrationまたは/ forget-passwordまたは/ logoutルートにいる場合はどうなりますか?if条件でそれらのルートもチェックすべきではないでしょうか?このように、ユーザーは登録中または新しいパスワードの要求中にリダイレクトされる可能性があります。
ジュアルジー

1
ここでのもう1つの重要な詳細は、サブスクライバーの「優先順位」です。上記のリダイレクトが開始される前に、いくつかのルートが解決することがわかりました。しかし、優先順位を設定する(最初に高い数値を起動する)ことで解決できます。上記の例では、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.