Программная олицетворение другого пользователя без выхода из системы текущего пользователя, вошедшего в систему
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).
Ответы:
Функция drupal_cron_run () дает прекрасный пример именно для этого, так как она меняет текущего пользователя на анонимного при каждом запуске cron, а затем переключается обратно после этого.
источник
$GLOBALS
или просто в другую переменную для сохранности) и переключиться на любого пользователя, загрузив его с помощьюuser_load()
. Что позволяет вам делать некоторые ужасные вещи, такие как маскарад под определенных пользователей, настроенных с определенными разрешениями для выполнения определенного процесса. Принцип тот же.