Програмно себе представляє інший користувач, не викликаючи вихідного користувача


9

Як модуль повинен змінити значення глобального $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(). Це дозволяє вам робити деякі жахливі речі, такі як маскарад, як конкретні користувачі, створені з певними дозволами для виконання певного процесу. Принцип той же.
Грег

Лише потенційна проблема 1 з цим фрагментом коду. Ви повинні зберегти старий сеанс у змінній $ old_session. Встановіть сеанс збереження на значення false, а наприкінці drupal_save_session ($ old_session).
iStryker

доступ та захоплення екрана, використовуючи drupal.org/project/phantomjs_capture як інший користувач. Це можливо / хитро? (DO issue drupal.org/node/2899252 ).
kiranking
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.