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


14

मैं लॉग इन करने के बाद उपयोगकर्ताओं को पुनर्निर्देशित करना चाहूंगा। क्या hook_user_login()पुनर्निर्देशन का उपयोग करना संभव है ? मैं पुनर्निर्देशन के लिए पैरामीटर कैसे जोड़ूं?

जवाबों:


19

आपको लॉगिन फ़ॉर्म को बदलने और सबमिट हैंडलर जोड़ने की आवश्यकता है जो पुनर्निर्देशन का ध्यान रखेगा। आप $form_state->setRedirectUrl()सीधे रूप में परिवर्तन का उपयोग नहीं कर सकते , क्योंकि यह ओवरराइट हो जाएगा UserForm::submitForm()

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_user_login_form_alter(&$form, FormStateInterface $form_state) {
  $form['#submit'][] = 'mymodule_user_login_submit';
}

/**
 * Form submission handler for user_login_form().
 *
 * Redirects the user to the dashboard after logging in.
 */
function mymodule_user_login_submit(&$form, FormStateInterface $form_state) {
  $url = Url::fromRoute('mymodule.dashboard');

  // Check if a destination was set, probably on an exception controller.
  // @see \Drupal\user\Form\UserLoginForm::submitForm()
  $request = \Drupal::service('request_stack')->getCurrentRequest();
  if (!$request->request->has('destination')) {
    $form_state->setRedirectUrl($url);
  }
  else {
    $request->query->set('destination', $request->request->get('destination'));
  }
}

4
जैसा कि @kiamlaluno द्वारा वर्णित है, कोई भी उपयोग कर सकता है$form_state->setRedirect('mymodule.dashboard);
फिलिप मिगुएल फोंसेका

3
कृपया उन उपयोगकर्ताओं को समझाएं जो इस उत्तर का अनुसरण करते हैं कि mymodule.dashboard को क्या करना चाहिए / क्या करना चाहिए। एक उदाहरण के लिए इसे <सामने> कैसे बदलें। चूंकि उपयोगकर्ता डैशबोर्ड लॉगिन के बाद डिफ़ॉल्ट रीडायरेक्ट है, इसलिए यहां यह उदाहरण बेकार है। नए उपयोगकर्ता को पता नहीं है कि किन हिस्सों को बदलना है और कैसे उसके रीडायरेक्ट के लिए है।
nilsun

1
सामने वाले पृष्ठ पर पुनर्निर्देशित करने के लिए, आप ऊपर दिए गए उदाहरण का उपयोग कर सकते हैं लेकिन उस लाइन को बदल सकते हैं जो $ url ऑब्जेक्ट को $ url = Url :: fromUri ('आंतरिक: /') में बदल देती है;
ओकेनेट करें

1
मुझे समझ नहीं आ रहा है कि elseयहाँ क्या हो रहा है? मौजूदा पुनर्निर्देशित बनाए रखना?
15:

1
आपको Drupal \ Core \ Url का उपयोग करना होगा; इसे सही ढंग से काम करने के लिए
जिग्नेश रावल

16

एक Drupal 8 साइट पर लॉगिन करने के बाद उपयोगकर्ताओं को पुनर्निर्देशित करना Drupal 7 पर कैसे किया गया, इससे अलग नहीं है, सिवाय इसके कि Drupal 8 के लिए कोड को अनुकूलित करने की आवश्यकता है।

विशेष रूप से:

  • hook_user_login()लॉगिन करने के बाद उपयोगकर्ताओं को पुनर्निर्देशित करने के लिए उपयोग नहीं किया जाता है, बस इस तथ्य के लिए कि उस हुक में उपयोगकर्ताओं को पुनर्निर्देशित hook_user_login()करने से अन्य कार्यान्वयन बंद हो जाएंगे ।
  • उपयोगकर्ताओं को पुनर्निर्देशित करने का सही तरीका लॉगिन फ़ॉर्म में एक फॉर्म सबमिशन हैंडलर जोड़ना है जो निम्नलिखित के समान कोड का उपयोग करता है।

    $form_state->setRedirect('user.page');

    ध्यान दें कि user.page Drupal पथ के लिए रूटिंग नाम है जहां आप चाहते हैं कि उपयोगकर्ता रीडायरेक्ट हो।
    यदि आपके पास Drupal\Core\Urlकक्षा का एक उदाहरण है , तो आप निम्न कोड का भी उपयोग कर सकते हैं।

    $form_state->setRedirectUrl($url);

    ध्यान रखें कि पहली विधि तब बेहतर होती है जब आप उपयोगकर्ताओं को उसी साइट के पृष्ठ पर पुनः निर्देशित कर रहे हों जिस साइट में उन्होंने लॉग इन किया था; दूसरी विधि आम तौर पर बाहरी URL का उपयोग करने वाले उपयोगकर्ताओं को पुनर्निर्देशित करने के लिए उपयोग की जाती है।


11

आप hook_user_login का उपयोग कर सकते हैं और इसे पुनर्निर्देशित करने का प्रयास कर सकते हैंyourpath

function yourmodule_user_login($account) {
  // We want to redirect user on login.
  $response = new RedirectResponse("yourpath");
  $response->send();
  return;
}

इसके अलावा, आप नियम मॉड्यूल का उपयोग कर सकते हैं , लेकिन Drupal 8 के लिए अभी तक स्थिर संस्करण नहीं है।


एक अच्छा सुरुचिपूर्ण समाधान, ड्रुपल 8.1 में मेरे लिए काम किया।
अलेक्सी रेयू

3
मैं हो रही थी ERR_RESPONSE_HEADERS_MULTIPLE_LOCATIONऊपर से कुछ निश्चित परिस्थितियों में त्रुटियों - मैं जगह का सुझाव देते हैं return;साथ exit;, रीडायरेक्ट सुनिश्चित करने के लिए - जो सेट हेडर - आखिरी बात क्रियान्वित किया जा रहा है।

2
hook_user_login () सबमिट हैंडलर से पहले कहा जाता है ताकि यह उन्हें बुलाया जाने से रोके। नीचे योगेश का जवाब यह करने का एक बेहतर तरीका है।
imclean

9

पार्टी में थोड़ी देर हो गई लेकिन https://www.drupal.org/node/2068293#comment-11712455 के अनुसार आप लॉग इन प्रोसेसिंग के अंत में अनुप्रेषित करने के लिए गंतव्य को hook_user_login () में सेट कर सकते हैं।

अर्थात

/**
 * Implements hook_user_login().
 */
function mymodule_user_login(\Drupal\user\UserInterface $account) {
  // Ignore password reset.
  $route_name = \Drupal::routeMatch()->getRouteName();
  if ($route_name !== 'user.reset.login') {
    // Do not interfere if a destination was already set.
    $current_request = \Drupal::service('request_stack')->getCurrentRequest();
    if (!$current_request->query->get('destination')) {
      // Default login destination to the dashboard.
      $current_request->query->set(
        'destination',
        \Drupal\Core\Url::fromRoute('mymodule.dashboard')->toString()
      );
    }
  }
}

FormState :: setRedirect () का उपयोग अन्य उत्तरों के अनुसार, संभवतः अधिकांश लोगों के उपयोग के मामलों को कवर करेगा और संभावित रूप से 'सही' उत्तर होगा, हालांकि हुक_सुअर_लगिन के साथ गंतव्य क्वेरी परम का उपयोग करने का मतलब है कि कोई भी फ़ॉर्म सबमिट करें * जो उपयोगकर्ता में लॉग इन रीडायरेक्ट करेगा लेकिन प्रपत्र / अनुरोध के किसी अन्य भाग के हस्तक्षेप या पूर्व ज्ञान के बिना।

यानी यह अभी भी एक कस्टम लॉगिन फॉर्म के साथ काम करेगा और गंतव्य का उपयोग करके किसी भी अन्य हुक को नहीं रोकता है (यह \Drupal\Core\EventSubscriber\RedirectResponseSubscriberप्रतिक्रिया प्रसंस्करण के अंत में लागू किया जाता है)।

* कोई भी फॉर्म सबमिट करें जो हुक_सुर्ज़_लगइन (user_login_finalize ()) को इनवॉइस करता है और मैन्युअल रूप से FormState :: setResponse () को कॉल नहीं करता है


1
यह काम करने का लाभ है अगर प्रमाणीकरण एक लॉगिन फ़ॉर्म के अलावा किसी अन्य चीज़ से होता है। लेकिन क्या यह अन्य मॉड्यूल से अन्य हुक_्यूसर_लोगिन कार्यान्वयन में हस्तक्षेप करता है?
जोनाथन

1
@ जोनाथन नहीं, यह केवल गंतव्य निर्धारित करता है और प्रारंभिक अनुरोध नहीं करता है-> भेजें () या कुछ भी (जैसे कि डी 7 ड्रुपलगोटो), यह अन्य सभी हुक, फॉर्म कॉलबैक आदि को सामान्य रूप से चलने से पहले कार्य करने की अनुमति देगा। । यह सिर्फ मानक ड्रुपल लॉगिन रीडायरेक्ट कैसे करता है।
सुत 3

1
कृपया उन उपयोगकर्ताओं को समझाएं जो इस उत्तर का अनुसरण करते हैं कि mymodule.dashboard को क्या करना चाहिए / क्या करना चाहिए। एक उदाहरण के लिए इसे <सामने> कैसे बदलें। चूंकि उपयोगकर्ता डैशबोर्ड लॉगिन के बाद डिफ़ॉल्ट रीडायरेक्ट है, इसलिए यहां यह उदाहरण बेकार है। नए उपयोगकर्ता को पता नहीं है कि किन हिस्सों को बदलना है और कैसे उसके रीडायरेक्ट के लिए है।
निलसुन

3
@nilsun mymodule.dashboardमार्ग का नाम है और किसी भी मार्ग का नाम (यानी साथ बदला जा सकता \Drupal\Core\Url::fromRoute('<front>')->toString()या \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString())। अधिक जानकारी के लिए drupal.org/docs/8/api/rout-system/rout-system-overview और api.drupal.org/api/drupal/core%21lib%21Drupal/21Core%21Url.php/…
Sut3kh

2
यह पासवर्ड रीसेट को तोड़ता है इसलिए मैं जवाब को वोट कर रहा हूं। (अन्य उत्तर कार्यों में सुझाए गए रूप में user_login_form के लिए एक फॉर्म सबमिशन हैंडलर बनाना।)
hnsfn

7

आप बस नियमों का उपयोग करके इसे कर सकते हैं

पर प्रतिक्रिया: उपयोगकर्ता के लॉग इन करने के बाद

  • क्रिया जोड़ें: रीडायरेक्ट >> फिर एक पैरामीटर का उपयोग करें या अपना यूआरएल टाइप करें।

3
इस पर मुख्य चेतावनी यह है कि नियम अभी भी Drupal 8 के लिए पूर्व रिलीज ALPHA में है, इसलिए ध्यान रखें कि आपको अपनी वेबसाइट पर स्थिरता की आवश्यकता है
फिलिप गिल्बर्ट

1
। प्रवेश प्रणाली जब साइट में उपयोगकर्ता के लॉग के बाद एक पृष्ठ पर रीडायरेक्ट है को खराब करता नियम खबरदार
InspiredCoder

6

आप उपयोगकर्ता लॉगिन फ़ॉर्म को भी बदल सकते हैं और अपने कस्टम सबमिट हैंडलर को जोड़ने के लिए $ form_state को पुनर्निर्देशित कर सकते हैं, बजाय हुक_user_login का उपयोग करते हुए अपने कस्टम URL पर सीधे उपयोगकर्ता को पुनर्निर्देशित करने के लिए ।

<?php
/**
 * Implements hook_form_alter().
 */
function [MODULENAME]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface\FormStateInterface $form_state, $form_id) {
  switch ($form_id) {
    // Alter login form and add own custom submit handler.
    case 'user_login_form':
      $form['#submit'][] = '_[MODULENAME]_user_login_form_submit';
      break;
  }
}

/**
 * Custom submit handler for login form.
 */
function _[MODULENAME]_user_login_form_submit($form, FormStateInterface $form_state) {
  // Set redirect to login form.
  $form_state->setRedirect('YOUR.MENU-ROUTER.NAME');
}

इसे $ form_state रिडायरेक्ट में जोड़ने से यह सुनिश्चित हो जाएगा कि अन्य सबमिट हैंडलर / लॉगिन हुक कहलाते हैं।

Drupal7 की तरह हम $ form_state ['redirect'] को सीधे सेट नहीं कर सकते, क्योंकि $ form_state अब क्लास ऑब्जेक्ट है। आगे के विवरण के लिए चेकआउट फ़ॉर्म :: सेटRedirect ()


6

D8 में, आप इस उद्देश्य के लिए उपयोगकर्ता डिफ़ॉल्ट पेज मॉड्यूल का उपयोग कर सकते हैं ।

यह मॉड्यूल आपको उस गंतव्य को कस्टमाइज़ करने की अनुमति देता है जिसे लॉग इन करने या लॉग आउट करने के बाद उपयोगकर्ता पुनर्निर्देशित होता है। आप भूमिकाओं या व्यक्तिगत उपयोगकर्ताओं द्वारा अनुकूलित कर सकते हैं।


1
काम करता है लेकिन यह पासवर्ड रीसेट लिंक को ध्यान में नहीं रखता है, जब उपयोगकर्ता अपने पासवर्ड को सेट करने के लिए वन टाइम लिंक का उपयोग करता है, तो यह उन्हें उस पेज पर रीडायरेक्ट करता है जिसे आप इस मॉड्यूल में सेट करते हैं न कि उपयोगकर्ता खाते में।
सोरिन

1
यह मॉड्यूल अभी भी पासवर्ड रीसेट को तोड़ता है इसलिए मैं जवाब को वोट कर रहा हूं। देखें drupal.org/project/user_default_page/issues/2991916 (के रूप में एक और उत्तर कार्यों में सुझाव दिया user_login_form के लिए एक फार्म जमा करने हैंडलर बना रहा है।)
hansfn

4

ऐसा करने के लिए एक सरल मॉड्यूल है जो Drupal 8 के साथ संगत है। इसे उपयोगकर्ता डिफ़ॉल्ट पृष्ठ कहा जाता है ।

मॉड्यूल आपको उस गंतव्य को अनुकूलित करने की अनुमति देता है जो लॉग इन करने या लॉग आउट करने के बाद किसी उपयोगकर्ता को पुनर्निर्देशित किया जाता है। आप भूमिकाओं या व्यक्तिगत उपयोगकर्ताओं द्वारा अनुकूलित कर सकते हैं। और इस कार्रवाई के लिए कॉन्फ़िगर करने योग्य ड्रुपल संदेशों को अनुकूलित करें।


3

hook_user_login() पुनर्निर्देशन के लिए काम नहीं करता है, इसका उपयोग तब किया जाता है जब आप उपयोगकर्ता के साथ कुछ करना चाहते हैं जब वह लॉग इन करता है। एफएक्स कोर उपयोगकर्ताओं को स्थानीय टाइमज़ोन सेट करने का सुझाव देता है यदि यह सेट नहीं है।

इसके बजाय आपको hook_form_alterसभी लॉगिन फ़ॉर्म का उपयोग करना होगा और एक कस्टम सबमिट हैंडलर जोड़ना होगा जो फॉर्म स्टेट ऑब्जेक्ट पर रीडायरेक्ट सेट करता है।


2

मैं अपने स्वयं के नियंत्रक में लॉगिन फ़ॉर्म प्रदर्शित कर रहा हूं। इस तरह से गैर-OO हुक के बिना फ़ॉर्म में हेरफेर करना संभव है (और लॉगिन के बाद उपयोगकर्ता को पुनर्निर्देशित करें):

$fb = $this->formBuilder();
$rc['top'] = ['#markup' => '<p>Willkommen im Kundenbereich von proreos. 
    Bitte melden Sie sich hier mit Ihrem
    Benutzernamen oder Ihrer Email Addresse an.</p>'];
$form = $fb->getForm("Drupal\user\Form\UserLoginForm");

$ug = $this->getUrlGenerator();
$redir = $ug->generateFromRoute('proreos.home', [], 
         ['query' => $this->getDestinationArray(), 'external' => FALSE]);
$form['#action'] = $redir;

$rc['login'] = $form;

return $rc;

आपको जो भी गंतव्य की आवश्यकता है, उसके लिए 'proreos.home' मार्ग बदलें।

सादर

रेनर


2

बस destinationurl लॉगिन करने के लिए पैरामीटर जोड़ें ।
उदाहरण:http://example.com/user/login?destination=/my-page

यदि आप इसे 403 (एक्सेस अस्वीकृत) पृष्ठों के लिए कर रहे हैं, तो निम्न मॉड्यूल का उपयोग करें :
https://www.drupal.org/project/redirect_403_to_login_page


2

मैं निम्नलिखित स्निपेट का काफी उपयोग करता हूं इसलिए मुझे लगा कि मैं इसे साझा करूंगा। आप उपयोगकर्ता द्वारा किस भूमिका के आधार पर अलग-अलग रीडायरेक्ट जोड़ सकते हैं।

use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Redirect on login.
 */
function MYMODULE_user_login($account) {
  $roles = $account->getRoles();
  if(in_array('webmaster', $roles)) {
    $response = new RedirectResponse('/admin/content');
    $response->send();
  }
}


1

आप पुनर्निर्देशन के लिए logintoboggan मॉड्यूल का उपयोग कर सकते हैं । यदि आपके पास उपयोगकर्ता नाम का उपयोग करते हुए लॉगिन की तरह अन्य कार्य करना चाहते हैं तो इसके अन्य कॉन्फ़िगरेशन हैं जो उपयोगी हो सकते हैं।


2
D7 के लिए अच्छा उत्तर है, लेकिन इस प्रश्न को D8 टैग किया गया है, और अभी तक Logintoboggan का कोई Drupal 8 संस्करण नहीं है।
केलली करी

1

https://www.drupal.org/project/redirect

  1. उपरोक्त मॉड्यूल स्थापित करें
  2. Url में गंतव्य पैरामीटर के रूप में कस्टम url पथ जोड़ें
  3. तो, उपरोक्त मॉड्यूल को पुनर्निर्देशित से कॉन्फ़िगर करें

    / उपयोगकर्ता / लॉगिन / उपयोगकर्ता / लॉगिन? गंतव्य = 'CUSTOM_NODE_PATH'

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

1

इस मुद्दे के लिए विशेष रूप से एक अन्य विकल्प एक सरल ड्रुपल 8 योगदान मॉड्यूल है: लॉगिन के बाद रीडायरेक्ट । मॉड्यूल यहां पाया जा सकता है:

https://www.drupal.org/project/redirect_after_login

जैसा कि विवरण दिखाता है, यह एक सरल, केंद्रित मॉड्यूल है जो ड्रुपल सुरक्षा सलाहकार नीति द्वारा कवर किया गया है।


1

/**
 * hook_user_login Redirect to English language whenever admin login
 **/
function modulename_user_login($account) {
  // We want to redirect user on login.
  $response = new Symfony\Component\HttpFoundation\RedirectResponse("/en/admin/config");
  $response->send();
  return;
}

0

मैं अन्य चीजों के आसपास जाने के लिए एक तरह से काम कर रहा था जो हुक_सुअर_लगिन पर निर्भर करते हैं क्योंकि कई अन्य विकल्प 8 के नए संस्करणों में टूट रहे हैं। कुछ अन्य री-डायरेक्ट मॉड्यूल बहुत सारे लेग-काम करते हैं जो या तो प्रासंगिक नहीं हैं और / या सिर्फ सही-सही hogging संसाधन। मैंने लॉगिन प्रक्रियाओं को संभालने के लिए इस सरल तर्क को एक कस्टम मॉड्यूल में एक साथ रखा:

function hook_user_login( UserInterface $account ) {
  // Doing checks to see if the login is from an HTML origin or not.
  // Could be from RESTful request to logins
  $request = \Drupal::request();
  if ($request->getRequestFormat() !== 'html') {
    // default
    return;
  }

  // Get the destination to see where the login request is going.
  // This is useful to check for interactions from user creations.
  $destination = $request->query->get('destination');

  // Check the destination. If the destination will result in a re-direct 
  // to your homepage (here statically defined, but could be programmatic)
  // then you can force re-direct to a different page. This is the URL defined
  // in config > system > basic site settings.
  if ($destination && $destination === '/whatever-homepage-uri-is') {
    // Regular login, send to alternate welcome page
    $response = new RedirectResponse('/welcome');
    $response->send();
    exit;
  }

  // default
  return;
}

मैं Drupal 8.8.3 के साथ सफलतापूर्वक इसका उपयोग कर रहा हूं और यह मेरे द्वारा बनाए गए किसी अन्य मॉड्यूल से मेरे REST लॉगिन अनुरोधों को नहीं तोड़ता है, नए खाते की रचनाओं के लिए सही-सही निर्देश देता है, और फिर नियमित साइट लॉगिन पर एक अलग पृष्ठ पर फिर से निर्देश देता है।

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