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

Аватар пользователя kolyuchy.org kolyuchy.org 23 ноября 2018 в 14:52

Всем привет!

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

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

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

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

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

Комментарии

Аватар пользователя ivnish ivnish 23 ноября 2018 в 16:02

Попробуйте ?destination=, но я не уверен, что оно будет работать с внешними источниками

Аватар пользователя kolyuchy.org kolyuchy.org 23 ноября 2018 в 17:54

Спасибо, да, эта мысль была первой, как было замечено, не работает со сторонними ссылками.

Аватар пользователя OldWarrior OldWarrior 23 ноября 2018 в 18:12

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

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

Аватар пользователя Andruxa Andruxa 24 ноября 2018 в 12:11
<?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://...

Аватар пользователя fairrandir fairrandir 23 ноября 2018 в 18:42

kolyuchy.org wrote:

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

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

Аватар пользователя Orion76 Orion76 24 ноября 2018 в 10:54
1

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

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

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

Аватар пользователя kolyuchy.org kolyuchy.org 26 ноября 2018 в 8:26

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

На ссылке выхода ссылка вида 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');
}
?>

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

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

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

Аватар пользователя Orion76 Orion76 26 ноября 2018 в 8:51

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

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

Аватар пользователя kolyuchy.org kolyuchy.org 26 ноября 2018 в 8:52

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

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

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

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