在代码中设置用户密码?


9

我希望能够在代码中更改用户密码。

由于user_load返回一个对象并需要user_save一个数组,因此这是不平凡的。

我认为有人已经找到了一种快速简便的方法。


我当前的解决方案如下所示:

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

但是我不喜欢这样绕过大多数钩子。

Answers:


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()获取任何错误代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.