Impostare la password dell'utente nel codice?


9

Vorrei poter modificare la password di un utente nel codice.

Poiché user_loadrestituisce un oggetto e user_savedesidera un array, questo non è banale.

Suppongo che qualcuno abbia trovato un modo semplice e veloce per farlo.


La mia soluzione attuale è simile a:

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

Ma non mi piace che questo aggiri la maggior parte dei ganci.

Risposte:


19

Devi solo chiamare user_save()usando un codice simile al seguente.

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

$accountcontiene l'oggetto utente che l'account utente può modificare. Ti faccio caricare usando user_load(), ma potrebbe anche essere l'oggetto utente per l'utente attualmente connesso. In quest'ultimo caso, Drupal rigenererà la sessione usando il seguente codice (parte di 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();
    }
  }

La password in $edit['pass']è la password semplice. user_save()lo sostituirà con il suo hash usando il seguente codice (all'inizio della funzione).

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

In alternativa, è possibile utilizzare 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);

In questo modo, se si dispone di un modulo che, ad esempio, convalida la password, il suo codice verrebbe eseguito e si otterrebbe qualsiasi codice di errore da form_get_errors () .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.