เปลี่ยนเส้นทางผู้ใช้ที่ไม่ระบุชื่อไปยังหน้าเข้าสู่ระบบ


14

ฉันต้องการถ้าผู้ใช้ไม่ได้เข้าสู่ระบบและเยี่ยมชมหน้าใด ๆ ของเว็บไซต์ของฉันยกเว้นเราเตอร์ REST VIEWSฉันเปลี่ยนเส้นทางเขา / เธอไปที่หน้าเข้าสู่ระบบใน drupal 8 ฉันพบโซลูชันนี้สำหรับ drupal 7 แต่ไม่พบโซลูชันใด ๆ สำหรับ Drupal 8


2
ในรหัสคุณจะเขียนสมาชิกเหตุการณ์เพื่อดำเนินการกับKernelEvents::REQUESTเหตุการณ์แล้วตั้งค่าการตอบสนองต่อ RedirectResponse สำหรับหน้าเข้าสู่ระบบ
mradcliffe

1
ฉันคิดอย่างอื่น คุณสามารถตั้งค่าหน้า 403 เป็น/userและถ้าพวกเขาไม่ระบุชื่อมันจะพาพวกเขาไป/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 จะเกิดอะไรขึ้นหากผู้ใช้อยู่ใน / ลงทะเบียนหรือ / ลืมรหัสผ่านหรือ / ออกจากระบบเส้นทาง? ไม่ควรตรวจสอบเส้นทางเหล่านั้นในสภาพที่เป็นอยู่ใช่หรือไม่ ตามนี้ผู้ใช้อาจถูกเปลี่ยนเส้นทางในขณะที่ลงทะเบียนหรือขอรหัสผ่านใหม่
Juyal Jee

2
รายละเอียดที่สำคัญอีกประการหนึ่งที่นี่คือ "ลำดับความสำคัญ" ของผู้สมัครสมาชิก ฉันพบเส้นทางบางเส้นทางที่จะแก้ไขก่อนที่การเปลี่ยนเส้นทางด้านบนจะเริ่มขึ้น แต่การตั้งค่าลำดับความสำคัญ (หมายเลขที่สูงกว่าจะยิงก่อน) จะช่วยแก้ไขปัญหานั้น ในตัวอย่างข้างต้นใช้อาร์เรย์ ('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}

สร้างคลาส eventsubscriber ของคุณเองภายในmodules/module-name/src/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.