Reindirizzare dopo l'accesso dell'utente


14

Vorrei reindirizzare gli utenti dopo aver effettuato l'accesso. È possibile utilizzare hook_user_login()per effettuare il reindirizzamento? Come aggiungo il parametro per il reindirizzamento?

Risposte:


19

Devi modificare il modulo di accesso e aggiungere un gestore di invio che si occuperà del reindirizzamento. Non è possibile utilizzare $form_state->setRedirectUrl()direttamente nella modifica del modulo, poiché verrà sovrascritto da 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
Come descritto da @kiamlaluno, si può anche usare$form_state->setRedirect('mymodule.dashboard);
Filipe Miguel Fonseca il

3
Spiegare agli utenti che seguono questa risposta cosa dovrebbe / fare mymodule.dashboard. Come cambiarlo in <front>, solo per un esempio. Poiché il dashboard dell'utente è il reindirizzamento predefinito dopo l'accesso, questo esempio qui è inutile. Il nuovo utente non sa quali parti modificare e in che modo reindirizzare.
nilsun,

1
Per reindirizzare alla prima pagina, è possibile utilizzare l'esempio sopra ma modificare la riga che genera l'oggetto $ url in $ url = Url :: fromUri ('internal: /');
Oknate

1
Non capisco cosa sta succedendo nel elsequi? Mantenere un reindirizzamento esistente?
user1359

1
devi usare drupal \ Core \ Url; per farlo funzionare correttamente
Jignesh Rawal,

16

Il reindirizzamento degli utenti dopo aver effettuato l'accesso a un sito Drupal 8 non è diverso da come è stato eseguito su Drupal 7, tranne per il fatto che il codice deve essere adattato per Drupal 8.

In particolare:

  • hook_user_login()non viene utilizzato per reindirizzare gli utenti dopo il login, semplicemente per il fatto che il reindirizzamento degli utenti in tale hook impedirebbe hook_user_login()di invocare altre implementazioni.
  • Il modo corretto di reindirizzare gli utenti è l'aggiunta di un gestore di invio modulo al modulo di accesso che utilizza un codice simile al seguente.

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

    Si noti che user.page è il nome di routing per il percorso Drupal in cui si desidera reindirizzare l'utente.
    Se hai un'istanza della Drupal\Core\Urlclasse, puoi anche usare il seguente codice.

    $form_state->setRedirectUrl($url);

    Tieni presente che il primo metodo è preferibile quando stai reindirizzando gli utenti a una pagina nello stesso sito in cui hanno effettuato l'accesso; il secondo metodo viene normalmente utilizzato per reindirizzare gli utenti utilizzando un URL esterno.


11

puoi usare hook_user_login e provare a reindirizzare ayourpath

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

Inoltre puoi usare il modulo Regole , ma NON esiste ancora una versione stabile per Drupal 8.


Una buona soluzione elegante, ha funzionato per me in Drupal 8.1.
Alexei Rayu,

3
Stavo ricevendo ERR_RESPONSE_HEADERS_MULTIPLE_LOCATIONerrori in determinate circostanze con quanto sopra - suggerisco di sostituirlo return;con exit;, per garantire che il reindirizzamento - che imposta le intestazioni - sia l'ultima cosa da eseguire.

2
hook_user_login () viene chiamato prima dei gestori di invio in modo da impedire che vengano chiamati. La risposta di Yogesh di seguito è un modo migliore per farlo.
imclean

9

Un po 'tardi alla festa, ma secondo https://www.drupal.org/node/2068293#comment-11712455 è possibile impostare la destinazione in hook_user_login () per reindirizzare alla fine dell'elaborazione dell'accesso.

vale a dire

/**
 * 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()
      );
    }
  }
}

L'uso di FormState :: setRedirect () secondo le altre risposte probabilmente coprirà i casi d'uso della maggior parte delle persone ed è potenzialmente la risposta "giusta", tuttavia l'utilizzo della query di destinazione param con hook_user_login significa che qualsiasi modulo inviato * che accede all'utente reindirizzerà ma senza interferenza o conoscenza preliminare di qualsiasi altra parte del modulo / richiesta.

vale a dire che continuerà a funzionare con un modulo di accesso personalizzato e l' utilizzo di destinazione non interrompe nessun altro hook (viene implementato \Drupal\Core\EventSubscriber\RedirectResponseSubscriberalla fine dell'elaborazione della risposta).

* Qualsiasi modulo che invoca hook_user_login (user_login_finalize ()) e non chiama manualmente FormState :: setResponse () .


1
Questo ha il vantaggio di funzionare se l'autenticazione avviene da qualcosa di diverso da un modulo di accesso. Ma questo interferisce con altre implementazioni hook_user_login di altri moduli?
Jonathan,

1
@Jonathan No, imposta solo la destinazione e non fa una richiesta anticipata-> send () o altro (es. Come d7 drupal_goto), consentirà a tutti gli altri hook, form callbacks ecc. Di funzionare normalmente prima di agire . Questo è il modo in cui lo fa il reindirizzamento di accesso drupal standard .
Sut3kh,

1
Spiegare agli utenti che seguono questa risposta cosa dovrebbe / fare mymodule.dashboard. Come cambiarlo in <front>, solo per un esempio. Poiché il dashboard dell'utente è il reindirizzamento predefinito dopo l'accesso, questo esempio qui è inutile. Il nuovo utente non sa quali parti modificare e in che modo reindirizzare.
nilsun,

3
@nilsun mymodule.dashboardè il nome della rotta e può essere sostituito con qualsiasi nome di rotta (ovvero \Drupal\Core\Url::fromRoute('<front>')->toString()o \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()). Per ulteriori informazioni, consultare drupal.org/docs/8/api/routing-system/routing-system-overview e api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…
Sut3kh

2
Questo interrompe la reimpostazione della password, quindi sto votando la risposta. (Creazione di un gestore di invio modulo per user_login_form come suggerito in un'altra risposta funziona.)
hansfn

7

Puoi semplicemente farlo usando le Regole

Riattiva: dopo che l'utente ha effettuato l'accesso

  • Aggiungi azione: reindirizza >> quindi utilizza un parametro o digita l'URL.

3
L'avvertenza principale su questo è che le regole sono ancora in pre-release ALPHA per Drupal 8, quindi fai attenzione se hai bisogno di stabilità sul tuo sito Web
Philippe Gilbert,

1
Le regole rovinano il sistema di accesso quando il sito ha reindirizzato a una pagina dopo che l'utente ha effettuato l'accesso. Attenzione
InspiredCoder

6

Puoi anche modificare il modulo di accesso dell'utente e aggiungere il tuo gestore di invio personalizzato per impostare il reindirizzamento $ form_state, invece di reindirizzare direttamente l'utente al tuo URL personalizzato utilizzando hook_user_login .

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

Aggiungendolo nel reindirizzamento $ form_state si assicurerà che gli altri gestori di invio / hook di login vengano chiamati.

Come Drupal7 non possiamo impostare $ form_state ['redirect'] direttamente, perché $ form_state è ora oggetto di classe. Acquista FormState :: setRedirect () per ulteriori dettagli.


6

In D8, è possibile utilizzare il modulo di pagina predefinito dell'utente per questo scopo.

Questo modulo consente di personalizzare la destinazione a cui viene reindirizzato un utente dopo aver effettuato l'accesso o disconnesso. È possibile personalizzare in base ai ruoli o ai singoli utenti.


1
Funziona ma non prende in considerazione i collegamenti di reimpostazione della password, quando l'utente utilizza il collegamento singolo per impostare la propria password, li reindirizza alla pagina impostata in questo modulo e non all'account utente.
Sorin,

1
Questo modulo interrompe ancora la reimpostazione della password, quindi sto votando in negativo la risposta. Vedi drupal.org/project/user_default_page/issues/2991916 (Creazione di un gestore di invio modulo per user_login_form come suggerito in un'altra risposta funziona.)
hansfn

4

Esiste un semplice modulo per farlo che è compatibile con Drupal 8. Si chiama User Default Page .

Il modulo consente di personalizzare la destinazione a cui viene reindirizzato un utente dopo aver effettuato l'accesso o disconnesso. È possibile personalizzare in base ai ruoli o ai singoli utenti. E personalizza i messaggi drupal configurabili per queste azioni.


3

hook_user_login() non funziona per il reindirizzamento, viene utilizzato se si desidera fare qualcosa con l'utente quando accede. Fx core suggerisce agli utenti di impostare il fuso orario locale se non è impostato.

Invece è necessario utilizzare hook_form_altersu tutti i moduli di accesso e aggiungere un gestore di invio personalizzato che imposta il reindirizzamento sull'oggetto stato del modulo.


2

Sto visualizzando il modulo di accesso nel mio controller. In questo modo è possibile manipolare il modulo (e quindi reindirizzare l'utente dopo il login) senza gli hook 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("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;

Cambia il percorso 'proreos.home' in qualunque destinazione ti serva.

Saluti

Rainer



2

Uso abbastanza il frammento seguente, quindi ho pensato di condividerlo. È possibile aggiungere reindirizzamenti diversi a seconda del ruolo dell'utente.

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

È possibile utilizzare il modulo logintoboggan per il reindirizzamento. Ha altri configuratrion che possono essere utili se si desidera che altre funzioni come login usando nomi utente.


2
Buona risposta per D7, ma questa domanda è contrassegnata con D8 e non esiste ancora una versione Drupal 8 di Logintoboggan.
Kelley Curry

1

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

  1. Installa il modulo sopra
  2. Aggiungi il percorso dell'URL personalizzato come parametro di destinazione nell'URL
  3. Quindi, configura il modulo sopra da cui reindirizzare

    / user / accedi a / user / login? destination = 'CUSTOM_NODE_PATH'

    • Volevo usare il modulo r4032login per consentire agli utenti autenticati di accedere alla pagina interessata, quando copiano / incollano l'URL o usano ad esempio un collegamento ipertestuale da word / excel.
    • Altri moduli di "reindirizzamento dell'accesso" sovrascriverebbero questa funzionalità e consentirebbero agli utenti di atterrare su una singola pagina configurata anche quando i parametri di destinazione sono inclusi nell'URL

1

Un'altra opzione specifica per questo problema è un semplice modulo fornito da Drupal 8: Reindirizzare dopo l'accesso . Il modulo può essere trovato qui:

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

Come mostra la descrizione, si tratta di un modulo semplice e mirato che è coperto dalla politica di consulenza sulla sicurezza di Drupal.


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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.