Définir le mot de passe des utilisateurs dans le code?

9

Je voudrais pouvoir changer le mot de passe d'un utilisateur en code.

Puisque user_loadrenvoie un objet et user_saveveut un tableau, ce n'est pas trivial.

Je suppose que quelqu'un a trouvé un moyen rapide et facile de le faire.


Ma solution actuelle ressemble à:

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

Mais je n'aime pas que cela contourne la plupart des crochets.

Létharion
la source

Réponses:

19

Vous avez juste besoin d'appeler en user_save()utilisant un code similaire au suivant.

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

$accountcontient l'objet utilisateur que le compte utilisateur doit modifier. Je vous user_load()demande de le charger en utilisant , mais il pourrait également s'agir de l'objet utilisateur pour l'utilisateur actuellement connecté. Dans ce dernier cas, Drupal régénérera la session en utilisant le code suivant (partie 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();
    }
  }

Le mot de passe dans $edit['pass']est le mot de passe ordinaire. user_save()le remplacera par son hachage en utilisant le code suivant (au début de la fonction).

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;
  }
}

Comme alternative, vous pouvez utiliser 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);

De cette façon, si vous avez un module qui, par exemple, valide le mot de passe, son code serait exécuté et vous obtiendriez tout code d'erreur de form_get_errors () .

kiamlaluno
la source