Programmgesteuertes Identifizieren eines anderen Benutzers, ohne dass sich der aktuell angemeldete Benutzer abmeldet

9

Wie sollte ein Modul den Wert von global ändern $user, seinen eigenen Code ausführen und den ursprünglichen Wert von wiederherstellen, $userohne dass der aktuelle Benutzer abgemeldet wird, wenn ein Fehler auftritt?

kiamlaluno
quelle
Es gibt ein altes offenes Problem, das eine Funktion hinzufügt, die dies auch bei mehrmaligem Aufruf richtig handhaben kann. Siehe drupal.org/node/287292 . Bitte überprüfen und testen Sie den Patch dort.
Berdir
1
Auf drupal.org wurde eine Community-Dokumentation erstellt, die die Lösung bietet, sich als ein anderer Benutzer für Drupal 6, Drupal 7 und Drupal 8 auszugeben: Sich sicher als ein anderer Benutzer auszugeben .
iStryker

Antworten:

18

Die Funktion drupal_cron_run () bietet genau dafür ein perfektes Beispiel, da sie den aktuellen Benutzer bei jeder Ausführung von cron in anonym ändert und nach Abschluss des Vorgangs wieder zurückschaltet.

// 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
quelle
Es ist erwähnenswert, dass Sie das aktuelle Benutzerobjekt irgendwo ablegen können (in $GLOBALSoder nur in einer anderen Variablen zur sicheren Aufbewahrung) und zu jedem Benutzer wechseln können, indem Sie es mit laden user_load(). Dies ermöglicht es Ihnen, einige schreckliche Dinge wie Maskerade zu tun, wenn ein bestimmter Benutzer mit bestimmten Berechtigungen einen bestimmten Prozess ausführt. Das Prinzip ist das gleiche.
Greg
Nur potenzielles 1 Problem mit diesem Code. Sie sollten die alte Sitzung in einer Variablen $ old_session speichern. Setzen Sie die Speichersitzung auf false und dann am Ende auf drupal_save_session ($ old_session).
iStryker
Zugreifen auf und Erfassen des Bildschirms mit drupal.org/project/phantomjs_capture als anderem Benutzer. Ist es möglich / schwierig? ( Geben Sie drupal.org/node/2899252 aus ).
Kiranking