Программная олицетворение другого пользователя без выхода из системы текущего пользователя, вошедшего в систему

9

Как модуль должен изменить значение global $user, выполнить собственный код и восстановить исходное значение, $userне вызывая выхода текущего пользователя в случае ошибки?

киамалуно
источник
Существует старая проблема, связанная с этим, которая добавляет функцию, которая может правильно обрабатывать это, даже если вызывается несколько раз. См. Drupal.org/node/287292 . Пожалуйста, просмотрите и протестируйте патч там.
Бердир
1
Создана документация сообщества, в которой есть решение выдать себя за другого пользователя для Drupal 6, Drupal 7 и Drupal 8 на drupal.org: Безопасное олицетворение другого пользователя .
iStryker

Ответы:

18

Функция drupal_cron_run () дает прекрасный пример именно для этого, так как она меняет текущего пользователя на анонимного при каждом запуске cron, а затем переключается обратно после этого.

// Prevent session information from being saved while doing funky stuff.
$original_session_state = drupal_save_session();
drupal_save_session(FALSE);

// Force the current user to anonymous to ensure consistent permissions on
// funky stuff runs.
$original_user = $GLOBALS['user'];
$GLOBALS['user'] = drupal_anonymous_user(); // Or use user_load() for a non-anonymous user.

// Do funky stuff here...

// Restore the user.
$GLOBALS['user'] = $original_user;
drupal_save_session($original_session_state);
Дейв Рид
источник
Стоит отметить, что вы можете поместить текущий пользовательский объект куда-нибудь (в $GLOBALSили просто в другую переменную для сохранности) и переключиться на любого пользователя, загрузив его с помощью user_load(). Что позволяет вам делать некоторые ужасные вещи, такие как маскарад под определенных пользователей, настроенных с определенными разрешениями для выполнения определенного процесса. Принцип тот же.
Грег
Единственная потенциальная проблема с этим фрагментом кода. Вы должны сохранить старый сеанс в переменной $ old_session. Установите для сеанса сохранения значение false, затем в конце drupal_save_session ($ old_session).
iStryker
доступ и захват экрана с использованием drupal.org/project/phantomjs_capture от имени другого пользователя. Это возможно / сложно? ( НУЖНО выпускать drupal.org/node/2899252 ).
kiranking