Rappresentare a livello di programmazione un altro utente senza causare la disconnessione dell'utente attualmente connesso


9

In che modo un modulo dovrebbe modificare il valore del globale $user, eseguire il proprio codice e ripristinare il valore originale $usersenza causare la disconnessione dell'utente corrente in caso di errore?


C'è un vecchio problema aperto su questo, che aggiunge una funzione che può gestirlo correttamente, anche se chiamato più volte. Vedi drupal.org/node/287292 . Si prega di rivedere e testare la patch lì.
Berdir,

1
È stata creata una documentazione della comunità che ha la soluzione per impersonare un altro utente per Drupal 6, Drupal 7 e Drupal 8 su drupal.org: impersonare in sicurezza un altro utente .
iStryker,

Risposte:


18

La funzione drupal_cron_run () fornisce un esempio perfetto proprio per questo, poiché cambia l'utente corrente in anonimo ogni volta che cron viene eseguito, quindi torna indietro dopo averlo fatto.

// 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);

Vale la pena notare che è possibile $GLOBALSspostare l'oggetto utente corrente da qualche parte (in o semplicemente in un'altra variabile per la conservazione) e passare a qualsiasi utente caricandolo con user_load(). Ciò ti consente di fare cose orribili come il travestimento come utenti specifici impostati con autorizzazioni specifiche per eseguire un processo specifico. Il principio è lo stesso.
Greg

Unico potenziale problema con questo pezzo di codice. Dovresti salvare la vecchia sessione in una variabile $ old_session. Impostare la sessione di salvataggio su false, quindi alla fine drupal_save_session ($ old_session).
iStryker,

accedere e catturare lo schermo usando drupal.org/project/phantomjs_capture come altro utente. È possibile / complicato? (DO emissione drupal.org/node/2899252 ).
Kirking,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.