Rediriger après la connexion de l'utilisateur

14

Je souhaite rediriger les utilisateurs après leur connexion. Est-il possible d'utiliser hook_user_login()pour effectuer la redirection? Comment ajouter le paramètre pour la redirection?

John Chan
la source

Réponses:

19

Vous devez modifier le formulaire de connexion et ajouter un gestionnaire de soumission qui se chargera de la redirection. Vous ne pouvez pas utiliser $form_state->setRedirectUrl()directement dans le formulaire alter, car il sera remplacé par 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'));
  }
}
pfrenssen
la source
4
Comme décrit par @kiamlaluno, on peut également utiliser$form_state->setRedirect('mymodule.dashboard);
Filipe Miguel Fonseca
3
Veuillez expliquer aux utilisateurs qui suivent cette réponse ce que mymodule.dashboard devrait / ferait. Comment changer cela en <front>, juste pour un exemple. Étant donné que le tableau de bord utilisateur est la redirection par défaut après la connexion, cet exemple ici est inutile. Le nouvel utilisateur ne sait pas quelles parties modifier et comment procéder à sa redirection.
nilsun
1
Pour rediriger vers la page d'accueil, vous pouvez utiliser l'exemple ci-dessus mais changer la ligne qui génère l'objet $ url en $ url = Url :: fromUri ('internal: /');
Oknate
1
Je ne comprends pas ce qui se passe elseici? Maintenir une redirection existante?
user1359
1
vous devez utiliser use Drupal \ Core \ Url; pour le faire fonctionner correctement
Jignesh Rawal
16

Rediriger les utilisateurs après leur connexion sur un site Drupal 8 n'est pas différent de la façon dont cela a été fait sur Drupal 7, sauf que le code doit être adapté pour Drupal 8.

En particulier:

  • hook_user_login()n'est pas utilisé pour rediriger les utilisateurs après leur connexion, simplement parce que la redirection des utilisateurs dans ce hook empêcherait d'autres hook_user_login()implémentations d'être appelées.
  • La bonne façon de rediriger les utilisateurs consiste à ajouter un gestionnaire de soumission de formulaire au formulaire de connexion qui utilise un code similaire au suivant.

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

    Notez que user.page est le nom de routage du chemin Drupal vers lequel vous souhaitez rediriger l'utilisateur.
    Si vous avez une instance de la Drupal\Core\Urlclasse, vous pouvez également utiliser le code suivant.

    $form_state->setRedirectUrl($url);

    Gardez à l'esprit que la première méthode est préférable lorsque vous redirigez les utilisateurs vers une page du même site auquel ils se sont connectés; la deuxième méthode est normalement utilisée pour rediriger les utilisateurs à l'aide d'une URL externe.

kiamlaluno
la source
11

vous pouvez utiliser hook_user_login et essayer de rediriger versyourpath

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

Vous pouvez également utiliser le module Rules , mais il n'y a PAS encore de version stable pour Drupal 8.

Yusef
la source
Une bonne solution élégante, a fonctionné pour moi dans Drupal 8.1.
Alexei Rayu
3
J'obtenais des ERR_RESPONSE_HEADERS_MULTIPLE_LOCATIONerreurs dans certaines circonstances avec ce qui précède - je suggère de le remplacer return;par exit;, pour garantir que la redirection - qui définit les en-têtes - est la dernière chose à exécuter.
2
hook_user_login () est appelé avant les gestionnaires de soumission, ce qui les empêcherait d'être appelés. La réponse de Yogesh ci-dessous est une meilleure façon de procéder.
imclean
9

Un peu tard pour la fête, mais selon https://www.drupal.org/node/2068293#comment-11712455, vous pouvez définir la destination dans hook_user_login () pour rediriger à la fin du processus de connexion.

c'est à 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'utilisation de FormState :: setRedirect () selon les autres réponses couvrira probablement la plupart des cas d'utilisation et est potentiellement la `` bonne '' réponse, cependant l'utilisation du paramètre de requête de destination avec hook_user_login signifie que tout formulaire soumis * que les journaux de l'utilisateur redirigeront mais sans interférence ni connaissance préalable de toute autre partie du formulaire / demande.

c'est-à-dire qu'il fonctionnera toujours avec un formulaire de connexion personnalisé et que l' utilisation de destination n'arrête aucun autre hook (il est implémenté par \Drupal\Core\EventSubscriber\RedirectResponseSubscriberà la fin du traitement des réponses).

* Tout formulaire soumis qui appelle hook_user_login (user_login_finalize ()) et n'appelle pas manuellement FormState :: setResponse () .

Sut3kh
la source
1
Cela a l'avantage de fonctionner si l'authentification se produit à partir d'autre chose qu'un formulaire de connexion. Mais cela interfère-t-il avec d'autres implémentations hook_user_login d'autres modules?
Jonathan
1
@Jonathan Non, il ne définit que la destination et ne fait pas de requête précoce -> send () ou quoi que ce soit (c'est-à-dire comme d7 drupal_goto), il permettra à tous les autres hooks, formulaires de rappel, etc. de s'exécuter comme d'habitude avant d'agir. . C'est exactement ce que fait la redirection de connexion drupal standard .
Sut3kh
1
Veuillez expliquer aux utilisateurs qui suivent cette réponse ce que mymodule.dashboard devrait / ferait. Comment changer cela en <front>, juste pour un exemple. Étant donné que le tableau de bord utilisateur est la redirection par défaut après la connexion, cet exemple ici est inutile. Le nouvel utilisateur ne sait pas quelles parties modifier et comment procéder à sa redirection.
nilsun
3
@nilsun mymodule.dashboardest le nom de l'itinéraire et peut être remplacé par n'importe quel nom d'itinéraire (c'est \Drupal\Core\Url::fromRoute('<front>')->toString()-à- dire ou \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()). Pour plus d'informations, voir drupal.org/docs/8/api/routing-system/routing-system-overview et api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…
Sut3kh
2
Cela brise la réinitialisation du mot de passe, donc je vote contre la réponse. (La création d'un gestionnaire de soumission de formulaire pour user_login_form comme suggéré dans une autre réponse fonctionne.)
hansfn
7

Vous pouvez simplement le faire en utilisant des règles

Réagissez: une fois l'utilisateur connecté

  • Ajouter une action: Rediriger >> puis utiliser un paramètre ou saisir votre URL.
Shrikant Nakade
la source
3
La principale mise en garde à ce sujet est que Rules est toujours en pré-version ALPHA pour Drupal 8 alors faites attention si vous avez besoin de stabilité sur votre site
Philippe Gilbert
1
Les règles gâchent le système de connexion lorsque le site est redirigé vers une page après la connexion de l'utilisateur. Attention
InspiredCoder
6

Vous pouvez également modifier le formulaire de connexion utilisateur et ajouter votre propre gestionnaire de soumission personnalisé pour définir la redirection $ form_state, au lieu de rediriger directement l'utilisateur vers votre URL personnalisée à l'aide de 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');
}

L'ajouter dans la redirection $ form_state fera en sorte que les autres gestionnaires de soumission / hooks de connexion soient appelés.

Comme Drupal7, nous ne pouvons pas définir $ form_state ['redirect'] directement, car $ form_state est maintenant un objet de classe. Commander FormState :: setRedirect () pour plus de détails.

Yogesh
la source
6

Dans D8, vous pouvez utiliser le module de page par défaut de l'utilisateur à cet effet.

Ce module vous permet de personnaliser la destination vers laquelle un utilisateur est redirigé après s'être connecté ou déconnecté. Vous pouvez personnaliser par rôles ou utilisateurs individuels.

Pallavi Chaudhury
la source
1
Fonctionne mais il ne prend pas en compte les liens de réinitialisation de mot de passe, lorsque l'utilisateur utilise le lien à usage unique pour définir son mot de passe, il les redirige vers la page que vous définissez dans ce module et non vers le compte d'utilisateur.
Sorin
1
Ce module casse toujours la réinitialisation du mot de passe, donc je vote contre la réponse. Voir drupal.org/project/user_default_page/issues/2991916 (La création d'un gestionnaire de soumission de formulaire pour user_login_form comme suggéré dans une autre réponse fonctionne.)
hansfn
4

Il existe un module simple pour ce faire qui est compatible avec Drupal 8. Il s'appelle Page par défaut de l'utilisateur .

Le module vous permet de personnaliser la destination vers laquelle un utilisateur est redirigé après s'être connecté ou déconnecté. Vous pouvez personnaliser par rôles ou utilisateurs individuels. Et personnalisez les messages drupal configurables pour ces actions.

Pallavi Chaudhury
la source
3

hook_user_login() ne fonctionne pas pour la redirection, il est utilisé si vous voulez faire quelque chose avec l'utilisateur lorsqu'il se connecte. Fx core suggère aux utilisateurs de définir le fuseau horaire local s'il n'est pas défini.

Au lieu de cela, vous devez utiliser hook_form_altersur tous les formulaires de connexion et ajouter un gestionnaire de soumission personnalisé qui définit la redirection sur l'objet d'état du formulaire.

googletorp
la source
2

J'affiche le formulaire de connexion dans mon propre contrôleur. De cette façon, il est possible de manipuler le formulaire (et ainsi de rediriger l'utilisateur après la connexion) sans les hooks 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;

Modifiez l'itinéraire «proreos.home» vers la destination dont vous avez besoin.

Cordialement

Rainer

Rainer Feike
la source
2

J'utilise beaucoup l'extrait suivant, j'ai donc pensé le partager. Vous pouvez ajouter différentes redirections selon le rôle de l'utilisateur.

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();
  }
}
Stef Van Looveren
la source
1

Vous pouvez utiliser le module logintoboggan pour la redirection. Il a d'autres configurations qui peuvent être utiles si vous voulez d'autres fonctionnalités comme la connexion à l'aide de noms d'utilisateur.

nitvirus
la source
2
Bonne réponse pour D7, mais cette question est étiquetée D8, et il n'y a pas encore de version Drupal 8 de Logintoboggan.
Kelley Curry
1

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

  1. Installez le module ci-dessus
  2. Ajouter un chemin d'URL personnalisé comme paramètre de destination dans l'URL
  3. Donc, configurez le module ci-dessus pour rediriger depuis

    / user / login à / user / login? destination = 'CUSTOM_NODE_PATH'

    • Je voulais utiliser le module r4032login pour permettre aux utilisateurs authentifiés d'accéder à la page concernée, lorsqu'ils copient / collent l'url ou utilisent un hyperlien de word / excel par exemple.
    • D'autres modules de «redirection de connexion» remplaceraient cette fonctionnalité et ne permettraient aux utilisateurs de se poser que sur une seule page configurée même lorsque les paramètres de destination sont inclus dans l'url
Abhi
la source
1

Une autre option spécifiquement pour ce problème est un simple module contribué à Drupal 8: Rediriger après la connexion . Le module se trouve ici:

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

Comme le montre la description, il s'agit d'un module simple et ciblé qui est couvert par la politique de conseil en sécurité Drupal.

bkudrle
la source
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;
}
Manikandan
la source
0

Je travaillais sur un moyen de contourner les autres choses qui dépendent de hook_user_login car de nombreuses autres options se brisent dans les nouvelles versions de 8. Certains autres modules redirigeant font beaucoup de travail de jambe qui n'est plus pertinent et / ou tout simplement des ressources de monopolisation. J'ai rassemblé cette logique simple dans un module personnalisé pour gérer les processus de connexion:

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

J'ai utilisé cela avec succès avec Drupal 8.8.3 et cela ne rompt pas mes demandes de connexion REST d'un autre module que j'ai construit, redirige correctement pour les nouvelles créations de compte, puis redirige vers une autre page sur une connexion de site régulière.

La

Ron
la source