Redirecționare după autentificarea utilizatorului (Drupal, 8, Redirecționare)

John Chan a intrebat.

Aș dori să redirecționez utilizatorii după ce se loghează. Este posibil să se utilizeze hook_user_login() pentru a face redirecționarea? Cum pot adăuga parametrul pentru redirecționare?

19 răspunsuri
pfrenssen

Trebuie să modificați formularul de autentificare și să adăugați un submit handler care se va ocupa de redirecționare. Nu puteți folosi $form_state->setRedirectUrl() direct în modificarea formularului, deoarece va fi suprascrisă de către 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 DrupaluserFormUserLoginForm::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'));
  }
}

Comentarii

  • Așa cum a descris @kiamlaluno, se poate utiliza și $form_state->setRedirect('mymodule.dashboard); –  > Por Filipe Miguel Fonseca.
  • Vă rugăm să explicați utilizatorilor care urmează acest răspuns ce ar trebui să facă / ar trebui să facă mymodule.dashboard. Cum se poate schimba asta în <front>, doar pentru un exemplu. Deoarece user dashboard este redirecționarea implicită după autentificare, acest exemplu de aici este inutil. Noul utilizator nu știe ce părți să modifice și cum pentru redirecționarea sa. –  > Por nilsun.
  • Pentru a redirecționa către prima pagină, puteți folosi exemplul de mai sus, dar schimbați linia care generează obiectul $url în $url = Url::fromUri(‘internal:/’); –  > Por oknate.
  • Nu înțeleg ce se întâmplă în else aici? Menținerea unei redirecționări existente? –  > Por user1359.
  • trebuie să folosiți use DrupalCoreUrl; pentru a face să funcționeze corect –  > Por Jignesh Rawal.
kiamlaluno

Redirecționarea utilizatorilor după ce se loghează pe un site Drupal 8 nu este diferită de modul în care se făcea pe Drupal 7, cu excepția codului care trebuie adaptat pentru Drupal 8.

În special:

  • hook_user_login() nu este utilizat pentru a redirecționa utilizatorii după ce se loghează, pur și simplu pentru faptul că redirecționarea utilizatorilor în acel cârlig ar opri alte hook_user_login() implementări să fie invocate.
  • Modul corect de redirecționare a utilizatorilor este adăugarea unui gestionar de trimitere a formularului de autentificare care folosește un cod similar cu cel de mai jos.

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

    Observați că user.page este numele de rutare pentru calea Drupal în care doriți ca utilizatorul să fie redirecționat.
    Dacă aveți o instanță a fișierului DrupalCoreUrl ați putea folosi și următorul cod.

    $form_state->setRedirectUrl($url);
    

    Rețineți că prima metodă este de preferat atunci când redirecționați utilizatorii către o pagină din același site în care s-au logat; a doua metodă este folosită în mod normal pentru a redirecționa utilizatorii folosind un URL extern.

Yuseferi

puteți utiliza hook_user_login și să încercați să redirecționați către yourpath

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

De asemenea, puteți utiliza Modulul Rules, , dar NU există încă o versiune stabilă pentru Drupal 8.

Comentarii

  • O soluție bună și elegantă, a funcționat pentru mine în Drupal 8.1. –  > Por Alexei Rayu.
  • Primeam ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION erori în anumite circumstanțe cu soluția de mai sus – vă sugerez să înlocuiți return; cu exit;, , pentru a vă asigura că redirecționarea – care stabilește antetele – este ultimul lucru care se execută. – user34185
  • hook_user_login() este apelat înainte de gestionarii de trimitere, astfel încât acest lucru ar împiedica apelarea lor. Răspunsul lui Yogesh de mai jos este o modalitate mai bună de a face acest lucru. –  > Por imclean.
Sut3kh

Un pic mai târziu la petrecere, dar conform https://www.drupal.org/node/2068293#comment-11712455 puteți seta destinația în hook_user_login() pentru a redirecționa la sfârșitul procesării de conectare.

Adică.

/**
 * Implements hook_user_login().
 */
function mymodule_user_login(DrupaluserUserInterface $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',
        DrupalCoreUrl::fromRoute('mymodule.dashboard')->toString()
      );
    }
  }
}

Folosind FormState::setRedirect(), conform celorlalte răspunsuri, va acoperi probabil cazurile de utilizare ale majorității oamenilor și este, potențial, răspunsul „corect”, însă folosirea parametrului de interogare a destinației cu hook_user_login înseamnă că orice trimitere de formular* care loghează utilizatorul va fi redirecționat, dar fără interferență sau cunoaștere prealabilă a oricărei alte părți a formularului/cererii.

De exemplu, va funcționa în continuare cu un formular de autentificare personalizat și utilizarea destinației nu oprește niciun alt cârlig. (este implementat de DrupalCoreEventSubscriberRedirectResponseSubscriber la sfârșitul procesării răspunsului).

*Orice formular de trimitere care invocă hook_user_login (user_login_finalize()) și nu apelează manual FormState::setResponse().

Comentarii

  • Acest lucru are avantajul de a funcționa în cazul în care autentificarea are loc din altceva decât un formular de autentificare. Dar interferează acest lucru cu alte implementări hook_user_login din alte module? –  > Por Jonathan.
  • @Jonathan Nu, setează doar destinația și nu face o solicitare timpurie->send() sau ceva de genul (adică, ca d7 drupal_goto), va permite tuturor celorlalte cârlige, callback-uri de formular etc. să ruleze ca de obicei înainte de a acționa. Acesta este doar modul în care redirecționarea standard de autentificare drupal face acest lucru. –  > Por Sut3kh.
  • Vă rugăm să explicați utilizatorilor care urmează acest răspuns ce ar trebui/ar trebui să facă mymodule.dashboard. Cum să schimbați asta în <front>, doar pentru un exemplu. Deoarece user dashboard este redirecționarea implicită după autentificare, acest exemplu de aici este inutil. Noul utilizator nu știe ce părți să modifice și cum pentru redirecționarea sa. –  > Por nilsun.
  • @nilsun mymodule.dashboard este numele rutei și poate fi înlocuit cu orice nume de rută (de ex. DrupalCoreUrl::fromRoute('<front>')->toString() sau DrupalCoreUrl::fromRoute('entity.node.canonical', ['node' => 123])->toString()). Pentru mai multe informații, consultați drupal.org/docs/8/api/routing-system/routing-system-overview și api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/… –  > Por Sut3kh.
  • Acest lucru strică resetarea parolei, așa că votez în jos răspunsul. (Crearea unui gestionar de trimitere a formularului pentru user_login_form așa cum se sugerează într-un alt răspuns funcționează). –  > Por hansfn.
Shrikant Nakade

Puteți face acest lucru pur și simplu folosind Reguli

React on: După ce utilizatorul s-a logat

  • Adăugați o acțiune: Redirecționare >> apoi folosiți un parametru sau introduceți url-ul.

Comentarii

  • Principala atenționare cu privire la acest lucru este că Rules este încă în pre-lansare ALPHA pentru Drupal 8, așa că aveți grijă dacă aveți nevoie de stabilitate pe site-ul dvs. web –  > Por Philippe Gilbert.
  • Rules încurcă sistemul de logare atunci când site-ul are redirecționare către o pagină după ce utilizatorul se loghează. Atenție –  > Por InspiredCoder.
Yogesh

Puteți, de asemenea, să modificați formularul de autentificare a utilizatorului și să adăugați propriul dvs. handler de trimitere personalizat pentru a seta redirecționarea $form_state, în loc să redirecționați direct utilizatorul către URL-ul dvs. personalizat folosind hook_user_login.

<?php
/**
 * Implements hook_form_alter().
 */
function [MODULENAME]_form_alter(&$form, DrupalCoreFormFormStateInterfaceFormStateInterface $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');
}

Adăugarea acestuia în $form_state redirect se va asigura că ceilalți manageri de trimitere/croșete de logare sunt apelați.

La fel ca în Drupal7, nu putem seta $form_state[‘redirect’] direct, deoarece $form_state este acum obiect de clasă. Checkout FormState::setRedirect() pentru mai multe detalii.

Pallavi Chaudhury

În D8, puteți utiliza pagina implicită a utilizatorului în acest scop.

Acest modul vă permite să personalizați destinația către care este redirecționat un utilizator după ce se conectează sau se deconectează. Puteți personaliza în funcție de roluri sau de utilizatori individuali.

Comentarii

  • Funcționează, dar nu ia în considerare linkurile de resetare a parolei, atunci când utilizatorul folosește linkul unic pentru a-și seta parola, acesta îl redirecționează către pagina pe care ați setat-o în acest modul și nu către contul de utilizator. –  > Por Sorin.
  • Acest modul încă strică resetarea parolei, așa că votez negativ răspunsul. Vezi drupal.org/project/user_default_page/issues/2991916 (Crearea unui gestionar de trimitere a formularului pentru user_login_form așa cum se sugerează într-un alt răspuns funcționează). –  > Por hansfn.
Pallavi Chaudhury

Există un modul simplu pentru a face acest lucru, care este compatibil cu Drupal 8. Acesta se numește Pagina implicită a utilizatorului.

Modulul vă permite să personalizați destinația către care un utilizator este redirecționat după ce se conectează sau se deconectează. Puteți personaliza în funcție de roluri sau de utilizatori individuali. Și să personalizați mesaje drupal configurabile pentru aceste acțiuni.

googletorp

hook_user_login() nu funcționează pentru redirecționare, este folosit dacă doriți să faceți ceva cu utilizatorul atunci când se loghează. Fx core sugerează utilizatorilor să seteze fusul orar local dacă nu este setat.

În schimb, trebuie să utilizați hook_form_alter pe toate formularele de autentificare și să adăugați un gestionar de trimitere personalizat care să seteze redirecționarea pe obiectul de stare al formularului.

Rainer Feike

Afișez formularul de autentificare în propriul meu controler. În acest fel, este posibil să manipulez formularul (și astfel să redirecționez utilizatorul după autentificare) fără cârligele non-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("DrupaluserFormUserLoginForm");

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

$rc['login'] = $form;

return $rc;

Schimbați ruta ‘proreos.home’ la orice destinație de care aveți nevoie.

Salutări

Rainer

Lost Koder

Pur și simplu adăugați destination parametru la url-ul de autentificare.
Exemplu: http://example.com/user/login?destination=/my-page

Dacă faceți acest lucru pentru paginile 403 ( Acces refuzat ), utilizați următorul modul:
https://www.drupal.org/project/redirect_403_to_login_page

Stef Van Looveren

Folosesc destul de mult următorul fragment, așa că m-am gândit să îl împărtășesc. Puteți adăuga redirecționări diferite în funcție de rolul pe care îl are utilizatorul.

use SymfonyComponentHttpFoundationRedirectResponse;

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

Gaurav Singh

Comentarii

  • Versiunea D8 nu este disponibilă. Etichetă de întrebare pentru D8 nu pentru D7. –  > Por DRUPWAY.
nitvirus

Puteți utiliza logintoboggan pentru redirecționare.Acesta are și alte configurații care pot fi utile dacă doriți alte funcționalități, cum ar fi autentificarea folosind nume de utilizator.

Comentarii

  • Răspuns bun pentru D7, dar această întrebare este etichetată D8, și nu există încă o versiune Drupal 8 de Logintoboggan. –  > Por Kelley Curry.
Abhi

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

  1. Instalați modulul de mai sus
  2. Adăugați calea url personalizată ca parametru de destinație în url
  3. Deci, configurați modulul de mai sus pentru a redirecționa de la

    /user/login către /user/login?destination=’CUSTOM_NODE_PATH’

    • A dorit să utilizeze r4032login pentru a permite utilizatorilor autentificați să acceseze pagina în cauză, atunci când copiază/încolăcesc url-ul sau folosesc un hyperlink din word/excel, de exemplu.
    • Alte module „login redirect” ar anula această funcționalitate și ar permite utilizatorilor să aterizeze doar pe o singură pagină configurată, chiar și atunci când parametrii de destinație sunt incluși în url.

bkudrle

O altă opțiune specifică pentru această problemă este un modul simplu la care a contribuit Drupal 8: Redirecționare după autentificare. Modulul poate fi găsit aici:

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

După cum arată descrierea, este un modul simplu, concentrat, care este acoperit de politica de consultanță de securitate Drupal.

Manikandan

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

Ron

Am lucrat la o modalitate de a ocoli celelalte lucruri care depind de hook_user_login pentru că multe alte opțiuni se strică în versiunile mai noi ale 8. Unele alte module de redirecționare fac o mulțime de muncă de picior care fie nu mai este relevantă și/sau pur și simplu acaparează resurse. Am adunat această logică simplă într-un modul personalizat pentru gestionarea proceselor de autentificare:

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

Am folosit acest lucru cu succes cu Drupal 8.8.3 și nu-mi întrerupe cererile de conectare REST de la un alt modul pe care l-am construit, redirecționează corect pentru crearea de noi conturi și apoi redirecționează către o pagină diferită la o conectare obișnuită a site-ului.

lule75

Sau pur și simplu folosiți un modul unic în toate modulele Url Redirect https://www.drupal.org/project/url_redirect atât pentru distribuțiile D.7, cât și pentru D8