Anonim kullanıcıyı giriş sayfasına yönlendir


14

Eğer kullanıcı giriş yapmamış ve web sitemin REST VIEWS yönlendiricilerim dışında herhangi bir sayfayı ziyaret ederse, onu drupal 8'deki giriş sayfasına yönlendiriyorum, drupal 7 için bu çözümleri buldum, ancak Drupal 8 için herhangi bir çözüm bulamadım,


2
Kodda, KernelEvents::REQUESTolay üzerinde işlem yapmak için bir olay abonesi yazar ve ardından giriş sayfası için bir RedirectResponse yanıtını ayarlarsınız.
mradcliffe

1
Başka bir şey düşündüm. 403 sayfasını olarak ayarlayabilir ve /useranonim olmaları durumunda bunları alırsınız /user/login, ancak kimliği doğrulanmış kullanıcıları, aradıkları sayfaya erişimlerinin reddedildiğini söylemeden kullanıcı profillerine götürmenin yan etkisi ile .
mradcliffe

1
Anonim kullanıcılar için bir oturum açma yönlendirmesi eklemek için aşağıdaki modülü kullanın, yolları hariç tutmak için bir ayar vardır, bu yüzden dinlenme yollarınızı buna ekleyebilirsiniz. drupal.org/project/anonymous_redirect
Daniel Harper

1
Bu modül ayrıca işi de yapıyor: drupal.org/project/anonymous_login
Joris Lucius

Yanıtlar:


21

KernelEvents :: REQUEST öğesine abone olan özel bir modülde etkinlik abonesiyle kullanıcının durumunu çok erken test edebilirsiniz.

İlk olarak, olay abonesini mymodule.services.ymlmodül klasörünüze kaydedersiniz :

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

Ardından RedirectAnonymousSubscriber.php , /src/EventSubscriber/klasördeki modülünüze özel etkinlik aboneniz için ekleyin .

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

}

abonesi fikri için @mradcliffe'ye teşekkürler
oknate

1
o yaratmalı RedirectAnonymousSubscriber.php, cevabını güncelliyorum.
Yusef

@oknate kullanıcı / register veya / forget-password veya / logout yolundaysa ne olur? Bu rotaları if durumunda da kontrol etmemeli mi? Buna göre, kullanıcı kayıt sırasında yönlendirebilir veya yeni şifre talep edebilir.
Juyal Jee

2
Buradaki bir diğer önemli ayrıntı, abonenin "önceliği" dir. Bazı yönlendirmeler yukarıdaki yönlendirmeye başlamadan önce çözüleceğini buldum. Ancak önceliği ayarlamak (önce daha yüksek sayıda yangın çıkar) sorunu çözmeye yardımcı olur. Yukarıdaki örnekte dizi kullanın ('checkAuthStatus', 100). Abone ve öncelikle ilgili dokümanlar: symfony.com/doc/current/event_dispatcher.html
BWagner

6

Drupal 8.3.3'te, bu kod sonsuz bir yeniden yönlendirmeye neden olur. Bunu ekleyerek bunu düzelttim.

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

6

İlk olarak, etkinlik aboneniz için bir hizmet oluşturun. module-name.services.yml

Kod -

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

modules/module-name/src/EventSubscriberDizin içinde kendi eventsubscriber sınıfınızı oluşturun :

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;
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.