Representando programaticamente outro usuário sem fazer com que o usuário conectado no momento efetue logout

9

Como um módulo deve alterar o valor global $user, executar seu próprio código e restaurar o valor original $usersem fazer com que o usuário atual seja desconectado se ocorrer um erro?

kiamlaluno
fonte
Existe um problema antigo em aberto sobre isso, que adiciona uma função que pode lidar adequadamente com isso, mesmo quando chamada várias vezes. Veja drupal.org/node/287292 . Revise e teste o patch lá.
Berdir
11
Houve uma criação da documentação da comunidade que tem a solução para representar outro usuário para Drupal 6, Drupal 7 e Drupal 8 em drupal.org: Representando com segurança outro usuário .
IStryker

Respostas:

18

A função drupal_cron_run () fornece um exemplo perfeito para exatamente isso, pois altera o usuário atual para anônimo sempre que o cron é executado, e depois retorna depois que terminar.

// 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
fonte
Vale ressaltar que você pode colocar o objeto de usuário atual em algum lugar (em $GLOBALSou apenas em outra variável para segurança) e alternar para qualquer usuário carregando-o user_load(). O que permite que você faça coisas horríveis, como mascarar-se como usuários específicos configurados com permissões específicas para executar um processo específico. O princípio é o mesmo.
Greg
Somente 1 problema em potencial com esse trecho de código. Você deve salvar a sessão antiga em uma variável $ old_session. Defina a sessão de salvamento como false e, no final, drupal_save_session ($ old_session).
IStryker
acessando e capturando a tela usando drupal.org/project/phantomjs_capture como outro usuário. É possível / complicado? ( Edite drupal.org/node/2899252 ).
precisa saber é o seguinte