लॉगिन पेज पर अनाम उपयोगकर्ता को पुनर्निर्देशित करें


14

मैं चाहता हूं कि अगर उपयोगकर्ता मेरे REST VIEWS राउटर को छोड़कर मेरी वेबसाइट के किसी भी पृष्ठ पर लॉग इन नहीं करता है या नहीं, तो मैं उसे ड्रूपल 8 में लॉगिन पेज पर रीडायरेक्ट करता हूं, मुझे ड्रुपल 7 के लिए यह समाधान मिला लेकिन Drupal 8 के लिए कोई समाधान नहीं मिला।


2
कोड में आप ईवेंट सब्सक्राइबर को KernelEvents::REQUESTईवेंट पर कार्य करने के लिए लिखेंगे और फिर लॉगिन पेज के लिए एक रीडायरेक्ट रिप्रोंस पर प्रतिक्रिया सेट करेंगे।
mradcliffe

1
मैंने कुछ और सोचा। आप 403 पृष्ठ सेट कर सकते हैं /userऔर फिर यदि वे अनाम हैं, तो यह उन्हें ले जाएगा /user/login, लेकिन प्रमाणीकृत उपयोगकर्ताओं को उनके उपयोगकर्ता प्रोफ़ाइल में ले जाने के साइड इफेक्ट के साथ यह बताए बिना कि वे जिस पेज की तलाश कर रहे हैं, उससे उन्हें वंचित रखा गया है। ।
मैड्रक्लिफ

1
अनाम उपयोगकर्ताओं के लिए लॉगिन रीडायरेक्ट जोड़ने के लिए निम्न मॉड्यूल का उपयोग करें, इसमें पथों को बाहर करने की सेटिंग है, इसलिए मुझे लगता है कि आप इसमें अपने बाकी पथ जोड़ सकते हैं। drupal.org/project/anonymous_redirect
डैनियल हार्पर

1
यह मॉड्यूल काम भी करता है: drupal.org/project/anonymous_login
जोरिस लुसियस

जवाबों:


21

आप कर्नेलएवेंट्स :: 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, मैं आपका जवाब अपडेट करता हूं।
युसुफ

@ यदि उपयोगकर्ता / पंजीकरण या / भूल-पासवर्ड या लॉगआउट मार्ग पर है तो क्या करें? यह उन मार्गों के लिए और साथ ही अगर हालत में नहीं होना चाहिए? इसके अनुसार, नए पासवर्ड के लिए पंजीकरण या अनुरोध करते समय उपयोगकर्ता पुनर्निर्देशित हो सकता है।
जुयाल जी

2
यहां एक और महत्वपूर्ण विवरण ग्राहक की "प्राथमिकता" है। मैंने पाया कि कुछ मार्गों को kicks के ऊपर पुनर्निर्देशित करने से पहले हल कर लिया जाएगा। लेकिन प्राथमिकता निर्धारित करना (पहले अधिक संख्या में आग लगना) इसे हल करने में मदद करता है। ऊपर दिए गए उदाहरण में, सरणी ('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निर्देशिका के अंदर अपने स्वयं के इवेंटस्क्राइबर वर्ग बनाएं :

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;
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.