Usurper l'identité d'un autre utilisateur par programme sans provoquer la déconnexion de l'utilisateur actuellement connecté

9

Comment un module doit-il modifier la valeur du global $user, exécuter son propre code et restaurer la valeur d'origine de $usersans entraîner la déconnexion de l'utilisateur actuel en cas d'erreur?

kiamlaluno
la source
Il existe un ancien problème à ce sujet, qui ajoute une fonction qui peut gérer correctement cela, même lorsqu'il est appelé plusieurs fois. Voir drupal.org/node/287292 . Veuillez examiner et tester le patch là-bas.
Berdir
1
Il y a eu une création de documentation communautaire qui a la solution pour usurper l'identité d'un autre utilisateur pour Drupal 6, Drupal 7 et Drupal 8 sur drupal.org: Usurper l'identité d'un autre utilisateur en toute sécurité .
iStryker

Réponses:

18

La fonction drupal_cron_run () donne un exemple parfait pour cela, car elle change l'utilisateur actuel en anonyme chaque fois que cron est exécuté, puis revient en arrière une fois terminé.

// 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
la source
Il convient de noter que vous pouvez ranger l'objet utilisateur actuel quelque part (dans $GLOBALSou simplement dans une autre variable pour la sauvegarde) et basculer vers n'importe quel utilisateur en les chargeant avec user_load(). Ce qui vous permet de faire des choses horribles comme se faire passer pour un utilisateur spécifique configuré avec des autorisations spécifiques pour effectuer un processus spécifique. Le principe est le même.
Greg
Seul problème potentiel 1 avec ce morceau de code. Vous devez enregistrer l'ancienne session dans une variable $ old_session. Définissez la session de sauvegarde sur false, puis à la fin drupal_save_session ($ old_session).
iStryker
accéder et capturer l'écran en utilisant drupal.org/project/phantomjs_capture en tant qu'autre utilisateur. Est-ce possible / délicat? (DO issue drupal.org/node/2899252 ).
kiranking