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?
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.
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);
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).
Réponses:
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é.
la source
$GLOBALS
ou simplement dans une autre variable pour la sauvegarde) et basculer vers n'importe quel utilisateur en les chargeant avecuser_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.