Definir senha dos usuários no código?

9

Gostaria de poder alterar uma senha de usuário no código.

Como user_loadretorna um objeto e user_savedeseja uma matriz, isso não é trivial.

Suponho que alguém tenha descoberto uma maneira rápida e fácil de fazê-lo.


Minha solução atual se parece com:

db_update('users')
  ->fields(array('pass' => user_hash_password('some_password')))
  ->condition('uid', 1)
  ->execute();

Mas não gosto que isso ignore a maioria dos ganchos.

Letharion
fonte

Respostas:

19

Você só precisa chamar user_save()usando um código semelhante ao seguinte.

$edit['pass'] = 'New password';
user_save($account, $edit);

$accountcontém o objeto de usuário para a conta do usuário alterar. Consigo carregá-lo usando user_load(), mas também pode ser o objeto de usuário do usuário conectado no momento. Neste último caso, o Drupal regenerará a sessão usando o código a seguir (parte de user_save () ).

  // If the password changed, delete all open sessions and recreate
  // the current one.
  if ($account->pass != $account->original->pass) {
    drupal_session_destroy_uid($account->uid);
    if ($account->uid == $GLOBALS['user']->uid) {
      drupal_session_regenerate();
    }
  }

A senha $edit['pass']é a senha simples. user_save()irá substituí-lo por seu hash usando o seguinte código (no início da função).

if (!empty($edit['pass'])) {
  // Allow alternate password hashing schemes.
  require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
  $edit['pass'] = user_hash_password(trim($edit['pass']));
  // Abort if the hashing failed and returned FALSE.
  if (!$edit['pass']) {
    return FALSE;
  }
}

Como alternativa, você pode usar drupal_submit_form () .

$form_state = array();
$form_state['user'] = $account;
$form_state['values']['pass']['pass1'] = 'New password';
$form_state['values']['pass']['pass2'] = 'New password';
$form_state['values']['op'] = t('Save');
drupal_form_submit('user_profile_form', $form_state);

Dessa forma, se você tiver algum módulo que, por exemplo, valide a senha, seu código será executado e você obterá qualquer código de erro em form_get_errors () .

kiamlaluno
fonte