किसी अनाम उपयोगकर्ता को 403 त्रुटि के बाद लॉगिन फॉर्म में पुनर्निर्देशित कैसे करें?


13

यदि कोई उपयोगकर्ता 403 त्रुटि का सामना करता है, तो मैं एक अनाम उपयोगकर्ता को लॉगिन फ़ॉर्म पर पुनर्निर्देशित करना चाहता हूं।

मैंने ईवेंट सब्सक्राइबर बनाया है और यह मेरा कोड है, लेकिन मैं वर्तमान पृष्ठ पर लूप पर समाप्त होता हूं।

/**
   * Redirect anonymous user to login page if he encounters 404 or 403
   * response.
   *
   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $response
   *   The created response object that will be returned.
   * @param string $event
   *   The string representation of the event.
   * @param \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher
   *   Event dispatcher that lazily loads listeners and subscribers from the dependency injection
   *   container.
   */
  public function checkLoginNeeded(GetResponseEvent $response, $event, ContainerAwareEventDispatcher $event_dispatcher) {
    $routeMatch = RouteMatch::createFromRequest($response->getRequest());
    $route_name = $routeMatch->getRouteName();
    $is_anonymous = \Drupal::currentUser()->isAnonymous();
    $is_not_login = $route_name != 'user.login';

    if ($is_anonymous && $route_name == 'system.403' && $is_not_login) {
      $query = $response->getRequest()->query->all();
//      $query['destination'] = $routeMatch->getRouteObject()->getPath();
      $query['destination'] = \Drupal::url('<current>');
      $login_uri = \Drupal::url('user.login', [], ['query' => $query]);
      $returnResponse = new RedirectResponse($login_uri, Response::HTTP_FOUND);
      $response->setResponse($returnResponse);
    }
  }

मुझे लगता है कि यह इस तथ्य से संबंधित है कि प्रतिक्रिया में पहले से ही गंतव्य (वर्तमान uri) और system.404 और system.403 शामिल हैं, कुछ उच्च प्राथमिकताएं हैं जो मुझे इसे ओवरराइड करने से रोकती हैं।


क्या आप सिर्फ विधि के बजाय अपनी पूरी कक्षा को जोड़ सकते हैं?
googletorp

केवल $ घटनाएँ हैं [कर्नेलएवेन्ट्स :: अनुरोध] = 'चेकलॉइनइनडेड'; getSubscribedEvents () विधि में।

जवाबों:


14

मैंने देखा है कि इस सवाल का जवाब कभी नहीं दिया गया कि यह कैसे प्रोग्रामेटिक रूप से किया जाए। कोड वास्तव में काम करता है, जब एक अपवाद ग्राहक में रखा जाता है:

/src/EventSubscriber/RedirectOn403Subscriber.php:

<?php

namespace Drupal\mymodule\EventSubscriber;

use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;

class RedirectOn403Subscriber extends HttpExceptionSubscriberBase {

  protected $currentUser;

  public function __construct(AccountInterface $current_user) {
    $this->currentUser = $current_user;
  }

  protected function getHandledFormats() {
    return ['html'];
  }

  public function on403(GetResponseForExceptionEvent $event) {
    $request = $event->getRequest();
    $is_anonymous = $this->currentUser->isAnonymous();
    $route_name = $request->attributes->get('_route');
    $is_not_login = $route_name != 'user.login';
    if ($is_anonymous && $is_not_login) {
      $query = $request->query->all();
      $query['destination'] = Url::fromRoute('<current>')->toString();
      $login_uri = Url::fromRoute('user.login', [], ['query' => $query])->toString();
      $returnResponse = new RedirectResponse($login_uri);
      $event->setResponse($returnResponse);
    }
  }

}

mymodule.services.yml:

services:
  mymodule.exception403.subscriber:
    class: Drupal\mymodule\EventSubscriber\RedirectOn403Subscriber
    tags:
      - { name: event_subscriber }
    arguments: ['@current_user']

4
यह काम करता है और संभवतः सबसे अच्छा जवाब है जब तक कि संबंधित मॉड्यूल (नियम शामिल) में स्थिर रिलीज न हो। मुझे यह काम करने के लिए -> toString () से $ क्वेरी ['गंतव्य'] = Url :: fromRoute ('<current>') को जोड़ना पड़ा
कॉलिन शिप्टन

2
यह उत्तर उच्च दिखाने के लिए योग्य है!
pbonnefoi

13

सबसे आसान तरीका /admin/config/system/site-informationउस फ़ील्ड को ब्राउज़ करना और भरना है Default 403 (access denied) pageजिसके साथ पढ़ना हैuser/login


7
यह एक अच्छा समाधान है लेकिन यह इस तथ्य को ध्यान में नहीं रखता है कि उपयोगकर्ता पहले ही लॉग इन हो सकता है जिसमें मैंने विवरण में उल्लेख किया है।

9

बस इस प्रश्न का शीर्षक देख रहे हैं (= 403 से प्रवेश करने के लिए उपयोगकर्ता को पुनर्निर्देशित कैसे करें? ), ऐसा करने के लिए 2 विकल्प हैं, बिना किसी कस्टम कोड को शामिल किए, जैसा कि नीचे विस्तृत है।

विकल्प 1: CustomError मॉड्यूल का उपयोग करें

CustomError मॉड्यूल साइट व्यवस्थापक HTTP के लिए कस्टम त्रुटि पेज बनाने के लिए अनुमति देता है स्थिति कोड 403 (पहुँच से मना कर) और 404 (नहीं मिला), उनमें से प्रत्येक के लिए नोड्स बनाने के बिना। इसकी विशेषताओं के बारे में कुछ और जानकारी (इसके परियोजना पृष्ठ से):

  • कॉन्फ़िगर करने योग्य पृष्ठ शीर्षक और विवरण।
  • सामान्य नोड्स के साथ कोई लेखक और दिनांक / समय हेडर नहीं हैं।
  • किसी भी HTML स्वरूपित पाठ को पृष्ठ निकाय में रखा जा सकता है।
  • त्रुटि पृष्ठ उपयोग करने योग्य हैं।
  • वे उपयोगकर्ता जो लॉग इन नहीं हैं और लॉगिन करने के बाद जिस क्षेत्र में वे प्रवेश करना चाह रहे हैं, उस तक पहुंचने की कोशिश करेंगे।
  • 404s के लिए कस्टम पुनर्निर्देशन की अनुमति देता है।

आप शायद इस हिस्से में ज़्यादातर दिलचस्पी लेंगे " जो लोग लॉग इन नहीं हैं और ऐसे क्षेत्र में प्रवेश करने की कोशिश करते हैं जिसके लिए लॉगिन की आवश्यकता होती है उस पृष्ठ पर पुनर्निर्देशित किया जाएगा जिसे वे लॉगिन करने के बाद एक्सेस करने का प्रयास कर रहे थे। "

D8 के लिए इस मॉड्यूल के लिए एक 8.x-1.x-dev संस्करण भी उपलब्ध है, इसके बारे में अधिक विवरण अंक # 2219227 में पाया जा सकता है ।

विकल्प 2: नियम मॉड्यूल का उपयोग करें

"डिफ़ॉल्ट 403" पृष्ठ के पथ को मान लें no_access(व्यवस्थापक के माध्यम से)। फिर नियम मॉड्यूल का उपयोग करके एक नियम बनाएं , जैसे कि "नोड पर जाने के बाद" कुछ घटना के साथ no_access। ताकि पूरा नियम कुछ इस तरह दिखे:

  • घटनाएँ: नोड पर जाने के बादno_access
  • शर्तेँ:

    1. उपयोगकर्ता की भूमिका है -Parameter: User: [site:current-user], Roles: anonymous user
    2. पाठ तुलना नहीं -Parameter: Text: [site:current-page:url], Matching text: user/login
  • क्रिया: पृष्ठ पुनर्निर्देशित -Parameter: URL: user/login

यदि आप ऐसा करना चाहते हैं, तो आप ड्रुपल संदेश क्षेत्र में कुछ (सूचनात्मक) संदेश प्रदर्शित करने के लिए एक और एक्शन भी जोड़ सकते हैं, जैसे कि "आपने उस पृष्ठ पर जाने की कोशिश की जिसके लिए लॉगिन आवश्यक है ..."।

सच है, इसके लिए आपको एक अतिरिक्त योगदान मॉड्यूल ( नियम ) को सक्षम करने की आवश्यकता हो सकती है । लेकिन, जैसा कि इसकी बढ़ती लोकप्रियता से संकेत मिलता है, वह मॉड्यूल संभवतः पहले से ही किसी भी साइट ( व्यू मॉड्यूल के समान ) में पहले से ही सक्षम है , क्योंकि इस मॉड्यूल के दर्जनों उपयोग-मामले हैं।

D8 के लिए इस मॉड्यूल के लिए एक 8.x-3.x-alfa1 संस्करण भी उपलब्ध है, इसके D8 संस्करण के बारे में अधिक जानकारी अंक # 2574691 में प्राप्त की जा सकती है , जिसमें नियमों का एक लिंक शामिल है " नियम 8.x रोडमैप "

यदि उपरोक्त मदद नहीं करता है, तो आप यह जांचना चाहते हैं कि क्या आपके लूप का कारण (या आपके प्रश्न में "कुछ उच्च प्राथमिकता") को रोका नहीं जा सकता है / प्रश्न के उत्तर के समान कुछ बताया गया है " कैसे निर्दिष्ट करें " की तरह एक नियम घटना? "सामग्री 'होने जा रहा' देखी है" "।


4

मुझे लगता है कि आपकी समस्या का समाधान सरल है। आप आसानी से इसके लिए एक कस्टम पेज बना सकते हैं 404और 403फिर इस पेज के अंदर, अनाम उपयोगकर्ताओं को /userपेज पर रीडायरेक्ट कर सकते हैं ।

आप इस कोड का उपयोग कर सकते हैं

function YOURTHEME_preprocess_page(&$vars) {
   $header = drupal_get_http_header('status'); 
   if ($header == '404 Not Found') {     
       $vars['theme_hook_suggestions'][] = 'page__404';
   }
}

जब भी 404 होता है तो आपका page--404.tpl.phpउपयोग किया जाएगा। इस पेज में इस कोड का उपयोग करें

if(user_is_logged_in() == false){
       /// You can do anything here.
}

कैसे कस्टम 403 और Drupal में 404 पृष्ठ बनाने के लिए के लिए एक पृष्ठ बनाने का एक और तरीका बताते हैं 403और 404


5
हे मेट, आपको टैग और कोड की जांच करनी चाहिए। यह लड़का स्पष्ट रूप से Drupal 8.
alexej_d

1
नमस्ते, मैंने उसे एल्गोरिथ्म दिया, वह आसानी से इसे 8प्रारूप में बदल सकता है
एम अमा डी

3

ऐसा करने का सबसे आसान तरीका उपयोगकर्ता लॉगिन मॉड्यूल में रीडायरेक्ट 403 का उपयोग करना है (इसका एक देव संस्करण डी 8 के लिए मौजूद है)। यहाँ इसके बारे में एक उद्धरण है (इसके परियोजना पृष्ठ से):

HTTP 403 एरर पेज को Drupal / user / login पेज पर रीडायरेक्ट मैसेज के साथ रीडायरेक्ट करें:

"प्रवेश निषेध है! आपको इस पृष्ठ को देखने के लिए लॉगिन करना होगा।"

इसके अलावा, वांछित पृष्ठ को url क्वेरी स्ट्रिंग में जोड़ा जाता है ताकि, एक बार लॉगिन सफल होने के बाद, उपयोगकर्ता को सीधे वहां ले जाया जाए जहां वे मूल रूप से जाने की कोशिश कर रहे थे।


1
यह जवाब क्यों दिया गया है?
Milo Kroulík

@ milos.kroulik मुझे लगता है क्योंकि सवाल Drupal 8 के बारे में है, लेकिन यह मॉड्यूल के लिए है 7और6
M ama D

1
कोई भी मॉड्यूल विकास में एक Drupal 8 संस्करण नहीं है
कॉलिन शिप्टन

1
बहुत यकीन है कि डाउनवोट एक "लिंक-ओनली" उत्तर होने के कारण था (उत्तर डाउनवर्ड होने का एक विशिष्ट कारण, या यहां तक ​​कि हटा दिया गया ...)। इस तरह के उत्तर आम तौर पर "कम योग्यता वाले उत्तर" समीक्षा कतार में भी दिखाई देते हैं ... इस उत्तर के मेरे संपादित संस्करण को देखें अब इसके एक विस्तारित संस्करण के लिए (अब केवल उत्तर के रूप में एक लिंक के रूप में माना जाने का जोखिम नहीं है)।
पियरे.व्रीन्स

यदि उपयोगकर्ता पहले से ही लॉग इन है या यदि साइट fast404 और 403 का उपयोग कर रहा है, तो यह उत्तर ध्यान में नहीं आता है।

0

(1) "/my403.html" जैसे उपनाम के साथ एक पृष्ठ नोड बनाएं

(2) / व्यवस्थापक / कॉन्फ़िगरेशन / प्रणाली / साइट-जानकारी पर जाएं और "/my403.html" को 403-त्रुटि पृष्ठ के रूप में सेट करें

(3) / व्यवस्थापक / संरचना / ब्लॉक पर जाएं और मुख्य सामग्री क्षेत्र में "उपयोगकर्ता लॉगिन" ब्लॉक (सेक फॉर्म) जोड़ें। पेज "my403.html" पर ब्लॉक की उपस्थिति को प्रतिबंधित करें और "अतिथि" की भूमिका करें।

बस।

यदि आपको अधिक नियंत्रण की आवश्यकता है, तो अपने 403 पृष्ठ के लिए एक नियंत्रक बनाएं और हाथ से UserLoginForm जोड़ें।

सादर, रेनर

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