Programowo podszywanie się pod innego użytkownika bez powodowania wylogowania aktualnie zalogowanego użytkownika
9
Jak moduł powinien zmienić wartość globalną $user, wykonać swój własny kod i przywrócić pierwotną wartość $userbez powodowania wylogowania bieżącego użytkownika w przypadku wystąpienia błędu?
Jest otwarty stary problem na ten temat, który dodaje funkcję, która może odpowiednio sobie z tym poradzić, nawet jeśli wywoływana jest wielokrotnie. Zobacz drupal.org/node/287292 . Przejrzyj i przetestuj łatkę tam.
Berdir
1
Utworzono Dokumentację Społeczności, która ma rozwiązanie umożliwiające podszywanie się pod innego użytkownika w Drupal 6, Drupal 7 i Drupal 8 na drupal.org: Bezpieczne podszywanie się pod innego użytkownika .
iStryker,
Odpowiedzi:
18
Funkcja drupal_cron_run () stanowi doskonały przykład tego, ponieważ zmienia bieżącego użytkownika na anonimowego za każdym razem, gdy uruchamiany jest cron, a następnie przełącza się po jego zakończeniu.
// 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);
Warto zauważyć, że możesz gdzieś umieścić bieżący obiekt użytkownika (w $GLOBALSinnej zmiennej lub po prostu w innej zmiennej dla bezpieczeństwa) i przełączyć się na dowolnego użytkownika, ładując go user_load(). Co pozwala ci robić okropne rzeczy, takie jak maskarada, jako konkretni użytkownicy skonfigurowani z określonymi uprawnieniami do wykonania określonego procesu. Zasada jest taka sama.
Greg
Tylko jeden potencjalny problem z tym fragmentem kodu. Powinieneś zapisać starą sesję w zmiennej $ old_session. Ustaw sesję zapisu na false, a następnie na końcu drupal_save_session ($ old_session).
Odpowiedzi:
Funkcja drupal_cron_run () stanowi doskonały przykład tego, ponieważ zmienia bieżącego użytkownika na anonimowego za każdym razem, gdy uruchamiany jest cron, a następnie przełącza się po jego zakończeniu.
źródło
$GLOBALS
innej zmiennej lub po prostu w innej zmiennej dla bezpieczeństwa) i przełączyć się na dowolnego użytkownika, ładując gouser_load()
. Co pozwala ci robić okropne rzeczy, takie jak maskarada, jako konkretni użytkownicy skonfigurowani z określonymi uprawnieniami do wykonania określonego procesu. Zasada jest taka sama.