Redirect pengguna Anonim ke halaman masuk

14

Saya ingin jika pengguna tidak masuk dan mengunjungi halaman situs web saya kecuali router REST VIEWS saya mengarahkannya ke halaman login di drupal 8, saya menemukan solusi ini untuk drupal 7 tetapi tidak menemukan solusi untuk Drupal 8,

David Mcsmith
sumber
2
Dalam kode Anda akan menulis pelanggan acara untuk bertindak pada KernelEvents::REQUESTacara dan kemudian mengatur respons ke RedirectResponse untuk halaman login.
mradcliffe
1
Saya memikirkan sesuatu yang lain. Anda dapat mengatur halaman 403 ke /userdan kemudian jika mereka anonim, itu akan membawa mereka ke /user/login, tetapi dengan efek samping dari mengambil pengguna terotentikasi ke profil pengguna mereka tanpa memberi tahu mereka bahwa mereka telah ditolak akses ke halaman yang mereka cari .
mradcliffe
1
Gunakan modul berikut untuk menambahkan pengalihan login untuk pengguna anonim, ia memiliki pengaturan untuk mengecualikan jalur jadi saya pikir Anda dapat menambahkan jalur istirahat Anda di dalamnya. drupal.org/project/anonymous_redirect
Daniel Harper
1
Modul ini juga berfungsi
Joris Lucius

Jawaban:

21

Anda dapat menguji status pengguna sangat awal dengan pelanggan acara dalam modul khusus yang berlangganan KernelEvents :: REQUEST.

Pertama, Anda mendaftarkan pelanggan acara di mymodule.services.ymldalam folder modul Anda:

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

Kemudian tambahkan RedirectAnonymousSubscriber.php untuk pelanggan acara kustom Anda di modul Anda di /src/EventSubscriber/folder.

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
sumber
terima kasih kepada @mradcliffe untuk ide untuk pelanggan acara
oknate
1
dia harus membuat RedirectAnonymousSubscriber.php, saya memperbarui jawaban Anda.
Yusef
@mengatakan bagaimana jika pengguna berada di / registrasi atau / lupa kata sandi atau / rute keluar? Bukankah seharusnya memeriksa rute-rute itu juga dalam kondisi if? Sesuai dengan ini, pengguna mungkin dialihkan saat mendaftar atau meminta kata sandi baru.
Juyal Jee
2
Detail penting lainnya di sini adalah "prioritas" pelanggan. Saya menemukan beberapa rute yang akan diselesaikan sebelum pengalihan di atas dimulai. Tetapi pengaturan prioritas (angka yang lebih tinggi akan lebih dulu) membantu untuk menyelesaikannya. Pada contoh di atas, gunakan array ('checkAuthStatus', 100). Documents tentang pelanggan dan prioritas: symfony.com/doc/current/event_dispatcher.html
BWagner
6

Pada Drupal 8.3.3, kode ini menyebabkan redirection tanpa akhir. Saya telah memperbaikinya dengan menambahkan itu sebagai gantinya.

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

Pertama, buat layanan untuk pelanggan acara Anda di module-name.services.yml

Kode -

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

Buat acara Anda sendiri kelas pelanggan di dalam modules/module-name/src/EventSubscriberdirektori:

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
sumber