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

আমি মনে করি এটি এর সাথে সম্পর্কিত যে প্রতিক্রিয়াটির মধ্যে ইতিমধ্যে গন্তব্য (বর্তমান ইউরি) এবং সিস্টেম রয়েছে।


আপনি কি কেবলমাত্র পদ্ধতির পরিবর্তে আপনার পুরো ক্লাসটি যুক্ত করতে পারেন?
googletorp

এখানে কেবলমাত্র $ ইভেন্ট রয়েছে [কার্নেল এভেন্টস :: REQUEST] = 'চেকলগিননিড'; 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
প্রাসঙ্গিক মডিউলগুলির (বিধি অন্তর্ভুক্ত) স্থিতিশীল প্রকাশ না হওয়া পর্যন্ত এটি কার্যকর এবং সম্ভবত সেরা উত্তর। এটির কাজ পেতে আমাকে -> টু স্ট্রিং () - $ ক্যুয়ার ['গন্তব্য'] = url :: থেকে রৌটে ('<ক্রম>>') যুক্ত করতে হয়েছিল
কলিন শিপটন

2
এই উত্তরটি আরও বেশি দেখাতে হবে!
pbonnefoi

13

সবচেয়ে সহজ উপায় ব্রাউজ করা /admin/config/system/site-informationএবং যে ক্ষেত্রটি পড়ে তা পূরণ Default 403 (access denied) pageকরাuser/login


7
এটি একটি ভাল সমাধান তবে এটি বিবরণে উল্লেখ করেছিলাম যে ব্যবহারকারী ইতিমধ্যে লগইন হয়েছে এমনটি বিবেচনায় নেই।

9

কেবল এই প্রশ্নের শিরোনামটি দেখে (= 403 থেকে ব্যবহারকারীকে ফর্মটিতে লগইন করার জন্য কীভাবে পুনঃনির্দেশ করা যায়? ), নীচে বিস্তারিত হিসাবে, কোনও কাস্টম কোড জড়িত না করে এমন করার জন্য 2 টি বিকল্প রয়েছে।

বিকল্প 1: কাস্টমরর মডিউলটি ব্যবহার করুন

CustomError মডিউল সাইটের অ্যাডমিন HTTP এর জন্য কাস্টম ত্রুটি পৃষ্ঠাগুলি তৈরি করার অনুমতি দেয় স্থিতি কোডগুলি 403 (অ্যাক্সেস অস্বীকৃত) এবং 404 (পাওয়া), তাদের মধ্যে প্রত্যেকের জন্য নোড তৈরি ছাড়াই। এর বৈশিষ্ট্যগুলি সম্পর্কে আরও কিছু বিশদ (এর প্রকল্প পৃষ্ঠা থেকে):

  • পৃষ্ঠার শিরোনাম এবং বিবরণগুলি কনফিগারযোগ্য।
  • সাধারণ নোডের মতো কোনও লেখক এবং তারিখ / সময় শিরোনাম নেই।
  • যে কোনও এইচটিএমএল বিন্যাসিত পাঠ্য পৃষ্ঠা পৃষ্ঠায় স্থাপন করা যেতে পারে।
  • ত্রুটি পৃষ্ঠাগুলি থিমযোগ্য।
  • যে ব্যবহারকারীরা লগইন করেননি এবং লগইন প্রয়োজন এমন একটি অঞ্চলে অ্যাক্সেস করার চেষ্টা করছেন তাদের লগইন করার পরে যে পৃষ্ঠায় অ্যাক্সেস করার চেষ্টা করা হয়েছিল সেগুলিতে তাকে পুনঃনির্দেশিত করা হবে।
  • 404s এর জন্য কাস্টম পুনঃনির্দেশের অনুমতি দেয়।

আপনি সম্ভবত " ব্যবহারকারীগণ লগ ইন না করে এবং এমন একটি অঞ্চলে অ্যাক্সেস করার চেষ্টা করছেন যা লগইন করার প্রয়োজন রয়েছে সেই পৃষ্ঠায় পুনঃনির্দেশিত করা হবে যা তারা লগইন করার পরে অ্যাক্সেস করার চেষ্টা করেছিল। "

ডি 8 এর জন্য এই মডিউলটির জন্য একটি 8.x-1.x-dev সংস্করণও পাওয়া যায়, এটি সম্পর্কে আরও বিশদটি ইস্যু # 2219227 এ পাওয়া যাবে ।

বিকল্প 2: বিধি মডিউলটি ব্যবহার করুন

ধরে নিন "ডিফল্ট 403" পৃষ্ঠার পথটি no_access(প্রশাসকের মাধ্যমে) সেট করা আছে । তারপরে নিয়ম মডিউলটি ব্যবহার করে একটি নিয়ম তৈরি করুন , ইভেন্টটির মতো "নোড দেখার পরে" এর মতো কিছু no_access। যাতে পুরো নিয়মটি এরকম কিছু দেখায়:

  • ইভেন্টগুলি: নোড দেখার পরে Afterno_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

যদি আপনি এটি করতে চান, আপনি এমনকি ড্রুপাল বার্তা অঞ্চলে কিছু (তথ্যমূলক) বার্তা প্রদর্শন করতে অন্য একটি ক্রিয়াকলাপ যোগ করতে পারেন, "আপনি এমন একটি পৃষ্ঠায় দেখার চেষ্টা করেছিলেন যার জন্য লগইন প্রয়োজন ..."।

সত্য, এটির জন্য আপনাকে অতিরিক্ত অবদানযুক্ত মডিউল ( বিধি ) সক্ষম করার প্রয়োজন হতে পারে । তবে, এর ক্রমবর্ধমান জনপ্রিয়তার দ্বারাও বোঝানো হয়েছে যে মডিউলটি সম্ভবত ইতিমধ্যে বেশিরভাগ কোনও সাইটে ( ভিউজ মডিউলের অনুরূপ ) সক্রিয় রয়েছে , কারণ এই মডিউলটির জন্য কয়েক ডজন ব্যবহার-মামলা রয়েছে।

ডি 8 -র জন্য এই মডিউলের জন্য একটি 8.x-3.x-alfa1 সংস্করণও পাওয়া যায়, এর ডি 8 সংস্করণ সম্পর্কে আরও বিশদটি ইস্যু # 2574691 এ পাওয়া যাবে , যা " বিধি 8.x রোডম্যাপ " বিধি ইস্যুটির একটি লিঙ্ক অন্তর্ভুক্ত করে

উপরেরটি যদি সহায়তা না করে তবে আপনি যাচাই করতে চাইতে পারেন আপনার লুপের কারণ (বা "আপনার প্রশ্নের মতো" কিছু উচ্চ অগ্রাধিকার ") রোধ করা যায় না / প্রশ্নের উত্তরের অনুরূপ কিছু দ্বারা ব্যাখ্যা করা যায় না" কীভাবে নির্দিষ্ট করবেন? "সামগ্রী '' হতে চলেছে '? " এর মতো একটি বিধি ইভেন্ট event


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
আরে সাথী, আপনার ট্যাগ এবং কোডটি পরীক্ষা করা উচিত। এই লোকটি স্পষ্টত দ্রুপাল ৮ ব্যবহার করছে
এলেক্সে_ডিজ

1
হাই, আমি তাকে অ্যালগোরিদম দিয়েছি, সে সহজেই এটিকে 8ফর্ম্যাটে পরিবর্তন করতে পারে
M ama D

3

এটির সবচেয়ে সহজ উপায় হ'ল পুনর্নির্দেশ 403 ব্যবহারকারীর লগইন মডিউলটি (এটির একটি ডিভ সংস্করণ D8 এর জন্য বিদ্যমান)। এটি সম্পর্কে একটি উদ্ধৃতি এখানে (তার প্রকল্প পৃষ্ঠা থেকে):

এইচটিটিপি 403 ত্রুটি পৃষ্ঠাটি একটি alচ্ছিক বার্তা সহ ড্রুপাল / ব্যবহারকারী / লগইন পৃষ্ঠায় পুনর্নির্দেশ করুন:

"অ্যাক্সেস অস্বীকৃত! এই পৃষ্ঠাটি দেখতে আপনাকে অবশ্যই লগইন করতে হবে।"

এছাড়াও, কাঙ্ক্ষিত পৃষ্ঠাটি ইউআরএল ক্যোয়ারী স্ট্রিংয়ে যুক্ত করা হয়েছে যাতে একবার লগইন সফল হলে ব্যবহারকারীকে যেখানে সরাসরি তারা যাওয়ার চেষ্টা করা হয়েছিল সেখানে নিয়ে যাওয়া হয়।


1
কেন এই উত্তরটি নিম্নচ্যুত?
মিলিও ক্রোলেক

@ milos.kroulik আমি অনুমান করি কারণ প্রশ্নটি ড্রুপাল 8 সম্পর্কে তবে সেই মডিউলটি 7এবং6
এম আমা ডি

1
না যে মডিউলটির বিকাশে একটি ড্রুপাল 8 সংস্করণ রয়েছে
কলিন শিপটন

1
অত্যন্ত নিশ্চিত যে ডাউনওয়েটটি উত্তরটি "লিঙ্ক-ওয়ান" উত্তর হওয়ার কারণে হয়েছিল (উত্তরগুলি ডাউনভোট করার একটি সাধারণ কারণ, এমনকি এমনকি মুছে ফেলা হয়েছে ...)। এই জাতীয় উত্তরগুলি সাধারণত "কম পরিমাণের উত্তরগুলি" পর্যালোচনা সারিতেও প্রদর্শিত হয় ... এর উত্তর বাড়ানোর জন্য এখনই এই উত্তরটির আমার সম্পাদিত সংস্করণটি দেখুন (কেবলমাত্র একটি লিঙ্কের উত্তর হিসাবে বিবেচিত হওয়ার ঝুঁকি নেই)।
পিয়ের.ভ্রিয়েন্স 13

ব্যবহারকারী ইতিমধ্যে লগ করা হয় যদি এই উত্তরটি একাউন্টে লাগবে না বা সাইট যদি fast404 এবং 403. ব্যবহার করছে

0

(1) "/my403.html" এর মতো একটি উপাস দিয়ে একটি পৃষ্ঠা নোড তৈরি করুন

(২) / অ্যাডমিন / কনফিগারেশন / সিস্টেম / সাইট-তথ্য যান এবং 403-ত্রুটি পৃষ্ঠা হিসাবে "/my403.html" সেট করুন

(3) / প্রশাসক / কাঠামো / ব্লকে যান এবং মূল বিষয়বস্তু অঞ্চলে "ব্যবহারকারী লগইন" ব্লক (সেকশন ফর্ম) যুক্ত করুন। "My403.html" পৃষ্ঠা এবং "অতিথি" ভূমিকাতে ব্লকের উপস্থিতি সীমাবদ্ধ করুন।

এটাই.

আপনার যদি আরও নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনার 403 পৃষ্ঠার জন্য একটি নিয়ামক তৈরি করুন এবং ইউজারলোগিনফর্মটি হাতে যুক্ত করুন।

শুভেচ্ছা, রাইনার

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.