コードでユーザーのパスワードを設定しますか?


9

コードでユーザーのパスワードを変更できるようにしたいと思います。

以来user_load戻りオブジェクト、およびuser_save配列を望んでいる、これは非自明です。

誰かが素早く簡単な方法を見つけたと思います。


私の現在の解決策は次のようになります:

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

しかし、私はこれがほとんどのフックをバイパスするのが好きではありません。

回答:


19

user_save()次のようなコードを使用して呼び出すだけです。

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

$account変更するユーザーアカウントのユーザーオブジェクトが含まれます。を使用してロードしuser_load()ますが、現在ログインしているユーザーのユーザーオブジェクトにすることもできます。後者の場合、Drupalは次のコード(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();
    }
  }

のパスワード$edit['pass']はプレーンなパスワードです。user_save()次のコードを使用して、ハッシュに置き換えます(関数の先頭)。

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

別の方法として、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);

このようにして、たとえばパスワードを検証するモジュールがある場合、そのコードが実行され、form_get_errors()からエラーコードを取得します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.