Программно разлогинить пользователя и переадресовать

23 ноября 2018 в 14:52

Всем привет!

Задумка примерно такая: после разлогинивания пользователь должен перейти по определенной ссылке (может быть любой).

Реализация приходит на ум такая:

  1. пользователь переходит по ссылке вида /user/logout?goto=yandex.ru после чего нужно как-то переадресовать его... как - не ясно...
  2. пользователь переходит по ссылке вида /node/999?goto=yandex.ru, тут подключается Rules (просмотрена страница 999), и вот тут было бы круто разобрать URL, вытащить параметр goto и переадресовать пользователя.

Второй вариант кажется более правильным, осталось только понять, как разлогинить пользователя.

Заранее благодарю за помощь.

Комментарии

Если вопрос задан правильно (т.е. судя по заголовку поста - именно "программно"), то лучше всего решить вопрос через свой menu callback (т.е из своего модуля).

В этом коллбеке user_logout() и затем drupal_goto()

23 ноября 2018 в 18:12
<?php
/**
 * Implements hook_user_logout().
 */
function MYMODULE_user_logout() {
  
$to variable_get('MYMODULE_external_url''');
  if (
$to) {
    
session_destroy();
    
$options = array('external' => TRUE);
    
drupal_goto($to$options);
  }
}
?>

Если неохота морочиться с UI, то можно просто drush vset MYMODULE_external_url http://...

24 ноября 2018 в 12:11

kolyuchy.org wrote:

Без своего модуля не обойтись? Хочется решить стандартными методами.

Вот честно скажу, очень сильно сомневаюсь, что сильно нетиповые задачи можно решать стандартными методами.
Точнее можно, но потом сам чёрт ногу сломит, что и как и почему отрабатывает.

23 ноября 2018 в 18:42

"Стандартно" в данной ситуации было бы написать (если его нет) эвэнт(событие) для Rules "при разлогировании пользователя", и создать правило для этого события - редирект на нужный адрес.

Если надо разлогинить пользователя при определенном событии, то надо написать экшн (action) для Rules, который разлогинит пользователя.

в краце как-то так-)

24 ноября 2018 в 10:54

В общем, решил следующим способом.

На ссылке выхода ссылка вида user/logout?destination=node/999?goto=yandex.ru

На странице node/999 с использованием PHP-фильтра написано следующее:

<?php
if (isset($_GET['goto'])) {
  
$url $_GET['goto'];
  if (
preg_match("|[0-9a-z]*\.[0-9a-z]{2,8}|i"$url)) {
    
header('Location: http://'$url);
  } 
  else {
    
header('Location: http://site.com/home');
  }
}
else {
    
header('Location: http://site.com/home');
}
?>

Ну то есть, если переадресовать некуда, пользователь переходит на главную страницу.

Ну вот как-то так.

(не знаю, стоит ли писать в заголовке [Решено], потому как решение не соответствует описанию задачи...)

26 ноября 2018 в 8:26

Да и задача не совсем понятно сформулирована.

kolyuchy.org wrote:

Второй вариант кажется более правильным, осталось только понять, как разлогинить пользователя.

Критерий "правильности" не раскрыт.
Да и другое не понятно:
- зачем разлогинивать пользователя.
- откуда и почему берется параметр запроса "goto"

PS. И правильнее использовать не

<?php
header
('Location: http://site.com/home')
?>

а drupal_goto : https://api.drupal.org/api/drupal/includes!common.inc/function/drupal_go...

26 ноября 2018 в 8:51

- зачем разлогинивать пользователя.

Пользователь должен иметь возможность выйти из личного кабинета.

- откуда и почему берется параметр запроса "goto"

К личному кабинету пользователя "привязывается" его проект, поэтому после выхода он отправляется "к себе" на сайт.

26 ноября 2018 в 8:52