Hacerse pasar por otro usuario mediante programación sin hacer que el usuario actualmente conectado cierre sesión

9

¿Cómo debería un módulo cambiar el valor del global $user, ejecutar su propio código y restaurar el valor original $usersin que el usuario actual se desconecte si ocurre un error?

kiamlaluno
fuente
Hay un viejo problema abierto sobre esto, que agrega una función que puede manejar esto correctamente, incluso cuando se llama varias veces. Ver drupal.org/node/287292 . Por favor revise y pruebe el parche allí.
Berdir
1
Se ha creado una Documentación de la comunidad que tiene la solución para suplantar a otro usuario para Drupal 6, Drupal 7 y Drupal 8 en drupal.org: suplantación segura de otro usuario .
iStryker

Respuestas:

18

La función drupal_cron_run () da un ejemplo perfecto para esto, ya que cambia el usuario actual a anónimo cada vez que se ejecuta cron, luego vuelve a cambiar después de que se hace.

// 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);
Dave Reid
fuente
Vale la pena señalar que puede guardar el objeto de usuario actual en algún lugar (dentro $GLOBALSo solo en otra variable para su custodia) y cambiar a cualquier usuario cargándolo con user_load(). Lo que le permite hacer algunas cosas horribles como disfrazarse de usuarios específicos configurados con permisos específicos para realizar un proceso específico. El principio es el mismo.
Greg
Solo potencial 1 problema con esta pieza de código. Debe guardar la sesión anterior en una variable $ old_session. Establezca la sesión de guardar en falso, luego al final drupal_save_session ($ old_session).
iStryker
accediendo y capturando la pantalla usando drupal.org/project/phantomjs_capture como otro usuario. ¿Es posible / complicado? (DO número drupal.org/node/2899252 ).
kiranking