web-dev-qa-db-fra.com

Rediriger après la connexion de l'utilisateur

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?

14
John Chan

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 écrasé 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'));
  }
}
19
pfrenssen

Rediriger les utilisateurs après leur connexion sur un site Drupal 8 n'est pas différent de la façon dont cela s'est 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 les autres implémentations de hook_user_login() d'être invoqué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 classe Drupal\Core\Url , 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.

16
kiamlaluno

vous pouvez utiliser hook_user_login et essayer de rediriger vers yourpath

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

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

11
Yusef

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 * qui se connecte à l'utilisateur redirigera 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 l'utilisation de la destination n'arrête aucun autre hook (il est implémenté par \Drupal\Core\EventSubscriber\RedirectResponseSubscriber à la fin du traitement de la réponse).

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

9
Sut3kh

Vous pouvez simplement le faire en utilisant Rules

Réagissez: une fois l'utilisateur connecté

  • Ajouter une action: Rediriger >> puis utiliser un paramètre ou saisir votre URL.
7
Shrikant Nakade

Dans D8, vous pouvez utiliser le module 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.

6
Pallavi Chaudhury

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. Checkout FormState :: setRedirect () pour plus de détails.

6
Yogesh

Il existe un module simple pour ce faire qui est compatible avec Drupal 8. Il s'appelle ser Default Page .

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).

4
Pallavi Chaudhury

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_alter sur tous les formulaires de connexion et ajoutez un gestionnaire d'envoi personnalisé qui définit la redirection sur l'objet d'état du formulaire.

3
googletorp

Ajoutez simplement le paramètre destination à l'URL de connexion.
Exemple: http://example.com/user/login?destination=/my-page

Si vous le faites pour 403 pages (accès refusé), utilisez le module suivant:
https://www.drupal.org/project/redirect_403_to_login_page

2
Lost Koder

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

2
Rainer Feike

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();
  }
}
2
Stef Van Looveren

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.

1
nitvirus
1
Gaurav Singh

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 depuis 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
1
Abhi

Une autre option spécifiquement pour ce problème est un simple Drupal 8 contribué: Redirection après la connexion . Le module peut être trouvé 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 d'avis de sécurité Drupal.

1
bkudrle

/**
 * 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;
}
1
Manikandan

Je travaillais sur un moyen de contourner les autres choses qui dépendent de hook_user_login parce que de nombreuses autres options se cassent dans les nouvelles versions de 8. Certains autres modules redirigeant font beaucoup de travail de jambe ce ne sont plus des ressources de monopole pertinentes et/ou simplement dépassées. 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 REST demandes de connexion d'un autre module que j'ai construit, redirige correctement pour les nouveaux créations de compte, puis redirige vers une autre page sur une connexion de site régulière.

La

0
Ron