Chuyển hướng người dùng ẩn danh đến trang đăng nhập


14

Tôi muốn nếu người dùng không đăng nhập và truy cập bất kỳ trang nào trên trang web của tôi ngoại trừ bộ định tuyến REST VIEWS của tôi, tôi chuyển hướng anh ấy / cô ấy đến trang đăng nhập trong drupal 8, tôi đã tìm thấy giải pháp này cho drupal 7 nhưng không tìm thấy giải pháp nào cho Drupal 8,


2
Trong mã, bạn sẽ viết một người đăng ký sự kiện để hành động theo KernelEvents::REQUESTsự kiện và sau đó đặt phản hồi thành RedirectResponse cho trang đăng nhập.
mradcliffe

1
Tôi nghĩ về một cái gì đó khác. Bạn có thể đặt trang 403 thành /uservà sau đó nếu chúng ẩn danh, nó sẽ đưa họ đến /user/login, nhưng với tác dụng phụ là đưa người dùng được xác thực vào hồ sơ người dùng của họ mà không cho họ biết họ đã bị từ chối truy cập vào trang họ đang tìm kiếm .
mradcliffe

1
Sử dụng mô-đun sau để thêm chuyển hướng đăng nhập cho người dùng ẩn danh, nó có cài đặt để loại trừ các đường dẫn để tôi nghĩ bạn có thể thêm các đường dẫn còn lại của mình vào đó. drupal.org/project/anonymous_redirect
Daniel Harper

1
Mô-đun này cũng thực hiện công việc: drupal.org/project/anonymous_login
Joris Lucius

Câu trả lời:


20

Bạn có thể kiểm tra trạng thái của người dùng từ rất sớm với người đăng ký sự kiện trong mô-đun tùy chỉnh đăng ký KernelEvents :: REQUEST.

Đầu tiên, bạn đăng ký thuê bao sự kiện trong mymodule.services.ymlthư mục mô-đun của mình:

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

Sau đó thêm RedirectAnonymousSubscriber.php cho thuê bao sự kiện tùy chỉnh của bạn trong mô-đun của bạn trong /src/EventSubscriber/thư mục.

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

}

cảm ơn @mradcliffe về ý tưởng cho người đăng ký sự kiện
oknate

1
Anh ta nên tạo ra RedirectAnonymousSubscriber.php, tôi cập nhật câu trả lời của bạn.
Yusef

@oknate điều gì nếu người dùng đang trên / đăng ký hoặc / quên mật khẩu hoặc / lộ trình đăng xuất? Không nên kiểm tra các tuyến đường đó trong điều kiện if? Theo như điều này, người dùng có thể được chuyển hướng trong khi đăng ký hoặc yêu cầu mật khẩu mới.
Juyal Jee

1
Một chi tiết quan trọng khác ở đây là "ưu tiên" của thuê bao. Tôi đã tìm thấy một số tuyến đường sẽ giải quyết trước khi chuyển hướng ở trên khởi động. Nhưng đặt ưu tiên (số cao hơn sẽ kích hoạt trước) sẽ giúp giải quyết điều đó. Trong ví dụ trên, sử dụng mảng ('checkAuthStatus', 100). Tài liệu về người đăng ký và mức độ ưu tiên: symfony.com/doc/cản/event_dispatcher.html
BWagner

6

Đầu tiên, tạo một dịch vụ cho người đăng ký sự kiện của bạn trong module-name.services.yml

-

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

Tạo lớp người đăng ký sự kiện của riêng bạn trong modules/module-name/src/EventSubscriberthư mục:

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

5

Trên Drupal 8.3.3, mã này gây ra sự chuyển hướng vô tận. Tôi đã sửa nó bằng cách thêm nó vào.

..
$response = new RedirectResponse('/user/login', 301);
$response->send();
..
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.