Перенаправлення після входу користувача


14

Я хотів би перенаправити користувачів після входу в систему. Чи можна використовувати hook_user_login()переадресацію? Як додати параметр для переадресації?

Відповіді:


19

Вам потрібно змінити форму для входу та додати обробник подання, який подбає про перенаправлення. Ви не можете використати $form_state->setRedirectUrl()безпосередньо форму зміни форми, оскільки вона буде перезаписана 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
Як описав @kiamlaluno, можна також скористатися$form_state->setRedirect('mymodule.dashboard);
Філіпе Мігель Фонсека,

3
Поясніть, будь ласка, користувачам, які слідують за цією відповіддю, що має / що робитиме mymodule.dashboard. Як змінити це на <наперед>, лише на приклад. Оскільки інформаційна панель користувача є переадресацією за замовчуванням після входу, цей приклад тут марний. Новий користувач не знає, які частини змінити і як його переспрямувати.
nilsun

1
Щоб перенаправити на головну сторінку, ви можете використовувати приклад вище, але змінити рядок, який генерує об’єкт $ url, на $ url = Url :: fromUri ('внутрішній: /');
окнат

1
Я не розумію, що elseтут відбувається ? Підтримання наявного переспрямування?
user1359

1
вам доведеться використовувати Drupal \ Core \ Url; щоб змусити його працювати правильно
Jignesh Rawal

16

Перенаправлення користувачів після входу на сайт Drupal 8 не відрізняється від того, як це було зроблено на Drupal 7, за винятком того, що код повинен бути адаптований до Drupal 8.

Зокрема:

  • hook_user_login()не використовується для переадресації користувачів після входу в систему, просто для того, що перенаправлення користувачів у цьому гачку перешкоджає hook_user_login()виклику інших реалізацій.
  • Правильний спосіб перенаправлення користувачів - додавання обробника форми подання до форми для входу, який використовує код, подібний до наступного.

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

    Зауважте, що user.page - це ім'я маршрутизації для шляху Drupal, куди потрібно переспрямувати користувача.
    Якщо у вас є примірник Drupal\Core\Urlкласу, ви також можете використовувати наступний код.

    $form_state->setRedirectUrl($url);

    Майте на увазі, що перший спосіб є кращим, коли ви перенаправляєте користувачів на сторінку на тому самому веб-сайті, на якому вони увійшли; другий метод зазвичай використовується для перенаправлення користувачів за допомогою зовнішньої URL-адреси.


11

Ви можете використовувати hook_user_login і спробувати переспрямуватиyourpath

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

Також ви можете використовувати модуль Правила , але поки немає НЕ стабільної версії для Drupal 8.


Гарне елегантне рішення, працювало для мене в Drupal 8.1.
Олексій Раю

3
Я отримую ERR_RESPONSE_HEADERS_MULTIPLE_LOCATIONпомилки при певних обставинах з вищевикладеним - я пропоную замінити return;з exit;, щоб забезпечити переадресацію - який встановлює заголовки - це остання річ , яка буде виконана.

2
ho_user_login () викликається перед обробниками для надсилання, щоб це не дозволило їм викликати. Відповідь Йогеша нижче - це кращий спосіб зробити це.
нечистий

9

Трохи запізнюється на партію, але відповідно до https://www.drupal.org/node/2068293#comment-11712455 ви можете встановити призначення у moll_user_login () для переадресації в кінці обробки входу.

тобто

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

Використання FormState :: setRedirect () відповідно до інших відповідей, ймовірно, охоплюватиме випадки використання більшості людей і, можливо, є "правильним" відповіддю, однак використання параметрі запиту призначення за допомогою куки_user_login означає, що будь-яка форма *, яка надсилає *, що журнали в користувачеві буде перенаправлена, але без втручання чи попереднього знання будь-якої іншої частини форми / запиту.

тобто вона все ще працюватиме з власною формою входу, а використання призначення не зупиняє жодних інших гаків (це реалізується \Drupal\Core\EventSubscriber\RedirectResponseSubscriberв кінці обробки відповіді).

* Будь-яка форма подання, яка викликає прив'язку_користувача (user_login_finalize ()) і не викликає вручну FormState :: setResponse () .


1
Це має перевагу роботи, якщо автентифікація відбувається із чогось іншого, ніж форма входу. Але чи це заважає іншим реалізаціям кука_user_login з інших модулів?
Джонатан

1
@Jonathan Ні, він встановлює лише призначення та не робить раннього запиту-> send () або нічого подібного (наприклад, як d7 drupal_goto), він дозволить всім іншим гакам, формувати зворотні дзвінки тощо, як нормально, перш ніж на нього діяти . Це так, як це робить стандартне перенаправлення для входу в систему .
Sut3kh

1
Поясніть, будь ласка, користувачам, які слідують за цією відповіддю, що має / що робитиме mymodule.dashboard. Як змінити це на <наперед>, лише на приклад. Оскільки інформаційна панель користувача є переадресацією за замовчуванням після входу, цей приклад тут марний. Новий користувач не знає, які частини змінити і як його переспрямувати.
nilsun

3
@nilsun mymodule.dashboard- назва маршруту, і його можна замінити будь-якою назвою маршруту (тобто \Drupal\Core\Url::fromRoute('<front>')->toString()або \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()). Для отримання додаткової інформації див drupal.org/docs/8/api/routing-system/routing-system-overview і api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php / ...
Sut3kh

2
Це порушує скидання пароля, тому я відповідаю голосом. (Створення обробника форми подання для user_login_form, як запропоновано в іншій відповіді.)
hansfn

7

Ви можете просто зробити це за допомогою Правил

Реагуйте на: Після входу користувача

  • Додати дію: Перенаправлення >>, а потім скористайтеся параметром або введіть URL-адресу.

3
Основний застереження щодо цього полягає в тому, що правила все ще знаходяться в попередньому випуску ALPHA для Drupal 8, тому будьте уважні, якщо вам потрібна стабільність на вашому веб-сайті
Філіп Гілберт

1
Правила заблокували систему входу, коли сайт перенаправляє сторінку на сторінку після входу користувача. Остерігайтеся
InspiredCoder

6

Ви також можете змінити форму входу для користувача та додати власний власний обробник подання, щоб встановити $ form_state переадресацію, замість того, щоб безпосередньо перенаправляти користувача до власної URL-адреси за допомогою гака_користувача .

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

Додавши його в $ form_state переспрямування, переконайтеся, що будуть звернуті інші обробники та гачки входу.

Як і Drupal7, ми не можемо встановити $ form_state ['redirect'] безпосередньо, оскільки $ form_state зараз об’єкт класу. Оформити замовлення FormState :: setRedirect () для отримання детальної інформації.


6

У D8 для цієї мети можна використовувати модуль сторінки користувача за замовчуванням .

Цей модуль дозволяє налаштувати місце призначення, до якого перенаправляється користувач після входу або виходу з системи. Ви можете налаштувати за ролями чи окремими користувачами.


1
Працює, але він не враховує посилання для скидання пароля, коли користувач використовує одноразову посилання для встановлення свого пароля, він перенаправляє їх на сторінку, яку ви встановили в цьому модулі, а не обліковий запис користувача.
Сорін

1
Цей модуль все ще порушує скидання пароля, тому я відповідаю голосом. Див. Drupal.org/project/user_default_page/isissue/2991916 (Створення обробника форми подання форми для користувача_login_form, як запропоновано в іншій відповіді.)
hansfn

4

Для цього є простий модуль, сумісний з Drupal 8. Він називається Сторінка користувача за замовчуванням .

Модуль дозволяє налаштувати призначення, на яке перенаправляється користувач після входу або виходу з системи. Ви можете налаштувати за ролями чи окремими користувачами. І налаштувати настроювані друпальські повідомлення для цих дій.


3

hook_user_login() не працює для перенаправлення, він використовується, якщо ви хочете щось зробити з користувачем, коли він входить. Ядро Fx пропонує користувачам встановити локальний часовий пояс, якщо він не встановлений.

Натомість вам потрібно скористатись hook_form_alterусіма формами входу та додати спеціальний обробник подачі, який встановлює переспрямування на об'єкт стану форми.


2

Я показую форму реєстрації у власному контролері. Таким чином можна маніпулювати формою (і так перенаправляти користувача після входу в систему) без гачків, що не належать до 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;

Змініть маршрут "proreos.home" на будь-яке місце призначення.

З повагою

Райнер



2

Я використовую такий фрагмент досить багато, тому я подумав, що поділюсь ним. Ви можете додавати різні переадресації залежно від того, яку роль відіграє користувач.

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

Для перенаправлення можна використовувати модуль logintoboggan . У ньому є інші конфігурації, які можуть бути корисні, якщо ви хочете, щоб інші функції, такі як вхід у систему, використовували імена користувачів.


2
Хороша відповідь для D7, але це питання позначено тегом D8, і ще немає версії Drupal 8 для входу до сабонгану.
Келлі Карі

1

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

  1. Встановіть вищевказаний модуль
  2. Додати спеціальний шлях URL як параметр призначення в URL
  3. Отже, налаштуйте вищевказаний модуль для переадресації

    / user / login to / user / login? призначення = 'CUSTOM_NODE_PATH'

    • Хотіли використати модуль r4032login, щоб дозволити автентифікованим користувачам отримати доступ до відповідної сторінки, коли вони копіюють / вставляють URL або використовують гіперпосилання з word / excel, наприклад.
    • Інші модулі "переспрямування входу" замінять цю функціональність і дозволять користувачам висаджуватися на налаштовану єдину сторінку, навіть коли параметри призначення включені в URL-адресу

1

Інший варіант спеціально для цього питання - простий модуль, який надав Drupal 8: Перенаправлення після входу . Модуль можна знайти тут:

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

Як видно з опису, це простий, зосереджений модуль, який охоплюється консультаційною політикою щодо безпеки Друпалу.


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

0

Я працював над тим, щоб подолати інші речі, які залежать від mock_user_login, оскільки багато інших варіантів виходять з ладу у новіших версіях 8. Деякі інші модулі для перенаправлення виконують багато роботи на ногах, яка вже не актуальна і / або просто нецільові ресурси для вивільнення. Я зібрав цю просту логіку в спеціальний модуль для обробки процесів входу

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

Я успішно використовую це з Drupal 8.8.3, і він не порушує мої запити на вхід REST з іншого модуля, який я створив, перенаправляє правильно для створення нових облікових записів, а потім перенаправляє на іншу сторінку в звичайному вході на сайт.

Сігналы абмеркавання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.