Redirecionar após o login do usuário


13

Gostaria de redirecionar os usuários depois que eles fizerem login. É possível usar hook_user_login()o redirecionamento? Como adiciono o parâmetro para o redirecionamento?

Respostas:


19

Você precisa alterar o formulário de login e adicionar um manipulador de envio que cuidará do redirecionamento. Você não pode usar $form_state->setRedirectUrl()diretamente no formato alter, pois será substituído por 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
Conforme descrito por @kiamlaluno, também se pode utilizar$form_state->setRedirect('mymodule.dashboard);
Filipe Miguel Fonseca

3
Por favor, explique aos usuários que seguem esta resposta o que mymodule.dashboard deve / faria. Como mudar isso para <front>, apenas por exemplo. Como o painel do usuário é o redirecionamento padrão após o login, este exemplo aqui é inútil. O novo usuário não sabe quais partes alterar e como redirecionar.
N

1
Para redirecionar para a página inicial, você pode usar o exemplo acima, mas altere a linha que gera o objeto $ url para $ url = Url :: Url :: fromUri ('internal: /');
oknate

1
Eu não entendo o que está acontecendo elseaqui? Mantendo um redirecionamento existente?
user1359

1
você precisa usar o Drupal \ Core \ Url; para torná-lo funcionando corretamente
Jignesh Rawal

15

O redirecionamento de usuários após o login em um site do Drupal 8 não é diferente de como foi feito no Drupal 7, exceto que o código precisa ser adaptado para o Drupal 8.

Em particular:

  • hook_user_login()não é usado para redirecionar usuários após o logon, simplesmente pelo fato de que o redirecionamento de usuários nesse gancho impediria que outras hook_user_login()implementações fossem invocadas.
  • A maneira correta de redirecionar os usuários é adicionar um manipulador de envio de formulário ao formulário de logon que usa código semelhante ao seguinte.

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

    Observe que user.page é o nome do roteamento do caminho do Drupal para o qual você deseja que o usuário seja redirecionado.
    Se você tiver uma instância da Drupal\Core\Urlclasse, também poderá usar o código a seguir.

    $form_state->setRedirectUrl($url);

    Lembre-se de que o primeiro método é preferível quando você está redirecionando usuários para uma página no mesmo site em que efetuaram login; o segundo método é normalmente usado para redirecionar usuários usando um URL externo.


11

você pode usar hook_user_login e tentar redirecionar parayourpath

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

Além disso, você pode usar o módulo Rules , mas ainda não existe uma versão estável para o Drupal 8.


Uma boa solução elegante, funcionou para mim no Drupal 8.1.
Alexei Rayu 02 /

3
Eu estava recebendo ERR_RESPONSE_HEADERS_MULTIPLE_LOCATIONerros em determinadas circunstâncias com o descrito acima - sugiro substituir return;por exit;, para garantir que o redirecionamento - que define os cabeçalhos - seja a última coisa a ser executada.

2
hook_user_login () é chamado antes dos manipuladores de envio, portanto, isso evitaria que eles fossem chamados. A resposta de Yogesh abaixo é uma maneira melhor de fazer isso.
Imclean

9

Um pouco atrasado para a parte, mas conforme https://www.drupal.org/node/2068293#comment-11712455, você pode definir o destino em hook_user_login () para redirecionar ao final do processamento do login.

ie

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

Usar FormState :: setRedirect () de acordo com as outras respostas provavelmente abrangerá os casos de uso da maioria das pessoas e é potencialmente a resposta 'certa', no entanto, o uso do parâmetro de consulta de destino com hook_user_login significa que qualquer formulário enviado * que faça logon no usuário será redirecionado, mas sem interferência ou conhecimento prévio de qualquer outra parte do formulário / solicitação.

ou seja, ele ainda funcionará com um formulário de login personalizado e o uso do destino não interrompe outros ganchos (é implementado \Drupal\Core\EventSubscriber\RedirectResponseSubscriberno final do processamento da resposta).

* Qualquer envio de formulário que chame hook_user_login (user_login_finalize ()) e não chame manualmente FormState :: setResponse () .


1
Isso tem a vantagem de funcionar se a autenticação ocorrer a partir de algo diferente de um formulário de login. Mas isso interfere com outras implementações hook_user_login de outros módulos?
31417 Jonathan

1
@ Jonathan Não, ele apenas define o destino e não faz uma solicitação antecipada-> send () ou qualquer coisa (por exemplo, d7 drupal_goto), permitirá que todos os outros ganchos, retornos de chamada de forma etc. sejam executados normalmente antes de agir. . É assim que o redirecionamento de login padrão do drupal faz isso.
Sut3kh

1
Por favor, explique aos usuários que seguem esta resposta o que mymodule.dashboard deve / faria. Como mudar isso para <front>, apenas por exemplo. Como o painel do usuário é o redirecionamento padrão após o login, este exemplo aqui é inútil. O novo usuário não sabe quais partes alterar e como redirecionar.
N

3
@nilsun mymodule.dashboardé o nome da rota e pode ser substituído por qualquer nome de rota ( \Drupal\Core\Url::fromRoute('<front>')->toString()ou seja, ou \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()). Para mais informações consulte drupal.org/docs/8/api/routing-system/routing-system-overview e api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/...
Sut3kh

2
Isso quebra a redefinição de senha, por isso estou votando negativamente na resposta. (Criação de um manipulador de formulário de inscrição para user_login_form como sugerido em outra resposta obras.)
hansfn

7

Você pode simplesmente fazer isso usando Regras

Reagir: depois que o usuário estiver conectado

  • Adicionar ação: redirecione >> e use um parâmetro ou digite seu URL.

3
A principal ressalva sobre isso é que Rules ainda está em ALPHA pré-lançamento para Drupal 8 assim cuidar se você precisa de estabilidade em seu site
Philippe Gilbert

1
. Regras mexe-se o sistema de login quando o site tem redirecionamento para uma página depois de usuário efetua login Cuidado
InspiredCoder

6

Você também pode alterar o formulário de login do usuário e adicionar seu próprio manipulador de envio personalizado para definir o redirecionamento $ form_state, em vez de redirecionar o usuário diretamente para o URL personalizado usando 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');
}

Adicioná-lo no redirecionamento $ form_state garantirá que os outros manipuladores de envio / ganchos de login sejam chamados.

Como o Drupal7, não podemos definir $ form_state ['redirect'] diretamente, porque $ form_state agora é objeto de classe. Checkout FormState :: setRedirect () para obter mais detalhes.


6

No D8, você pode usar o módulo de página padrão do usuário para essa finalidade.

Este módulo permite que você personalize o destino ao qual um usuário é redirecionado após efetuar login ou logout. Você pode personalizar por funções ou usuários individuais.


1
Funciona, mas não leva em consideração os links de redefinição de senha. Quando o usuário usa o link único para definir sua senha, ele os redireciona para a página definida neste módulo e não para a conta do usuário.
Sorin

1
Este módulo ainda interrompe a redefinição de senha, por isso estou votando negativamente na resposta. Veja drupal.org/project/user_default_page/issues/2991916 (Criando um manipulador de formulário de inscrição para user_login_form como sugerido em outra resposta obras.)
hansfn

4

Existe um módulo simples para fazer isso, compatível com o Drupal 8. É chamado de página padrão do usuário .

O módulo permite que você personalize o destino para o qual um usuário é redirecionado após efetuar login ou logout. Você pode personalizar por funções ou usuários individuais. E personalize mensagens drupal configuráveis ​​para essas ações.


3

hook_user_login() não funciona para o redirecionamento, é usado se você quiser fazer algo com o usuário quando ele efetuar login. O Fx core sugere que os usuários definam o fuso horário local, se não estiver definido.

Em vez disso, você precisa usar hook_form_alterem todos os formulários de login e adicionar um manipulador de envio personalizado que defina o redirecionamento no objeto de estado do formulário.


2

Estou exibindo o formulário de login no meu próprio controlador. Dessa forma, é possível manipular o formulário (e, assim, redirecionar o usuário após o login) sem os ganchos não 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;

Mude a rota 'proreos.home' para o destino que você precisar.

Saudações

Rainer



2

Eu uso bastante o seguinte snippet, então pensei em compartilhá-lo. Você pode adicionar redirecionamentos diferentes, dependendo da função do usuário.

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

Você pode usar o módulo logintoboggan para redirecionar. Possui outras configurações que podem ser úteis se você quiser outras funções, como o login usando nomes de usuário.


2
Boa resposta para o D7, mas esta pergunta está identificada como D8 e ainda não existe a versão Drupal 8 do Logintoboggan.
Kelley Curry

1

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

  1. Instale o módulo acima
  2. Adicionar caminho de URL personalizado como o parâmetro de destino no URL
  3. Portanto, configure o módulo acima para redirecionar de

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

    • Queria usar o módulo r4032login para permitir que usuários autenticados acessem a página em questão, quando copiam / colam o URL ou usam um hiperlink do word / excel, por exemplo.
    • Outros módulos de 'redirecionamento de login' substituiriam essa funcionalidade e permitiriam que os usuários aterrissassem em uma única página configurada, mesmo quando os parâmetros de destino fossem incluídos no URL

1

Outra opção específica para esse problema é um simples módulo contribuído pelo Drupal 8: Redirecionar após o login . O módulo pode ser encontrado aqui:

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

Como mostra a descrição, é um módulo simples e focado, coberto pela política de consultoria de segurança do 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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.