Как программно изменить пароль пользователя Drupal?

мы собираемся развернуть сайт Drupal внутри интрасети компании. Существует требование к пользователю сбросить пароль. У нас есть централизованный механизм сброса пароля (для единого входа):

  • пользователь отправляет запрос на изменение пароля в system
  • запрос отправляется на сервер пароль
  • сервер паролей сбросит пароль пользователя в всем системам новый пароль
  • сервер пароль вышлю новый пароль на мобильный телефон пользователя через sms

теперь мы собираемся добавить сайт Drupal в всем системам. Пожалуйста, предложите способ изменить пароль для входа в систему Drupal с помощью внешней программы (предположим, что система может запускать скрипт на хосте Drupal и редактировать базу данных Drupal MySQL).

5 ответов


Если вы используете Drupal 6, то пароль, хранящийся в системе, является простым md5 пароля. Если вы используете PHP-скрипты для запуска сброса пароля, используйтеhttp://php.net/manual/en/function.md5.php функция.

имя пользователя и пароль хранятся в users таблица. Хэш md5 хранится в


для Drupal 7 -- надеюсь, что этот пользовательский код функции разрешает изменить пароль аноним пользователей.

function password_reset(){
    global $user;
    $hashthepass = 'password'; /* Your password value*/
    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
    $hashthepass = user_hash_password(trim($hashthepass));
    // Abort if the hashing failed and returned FALSE.
    if (!$hashthepass) {
      return FALSE;
    }
    else {
      db_update('users')
        ->fields(array(
          'pass' => $hashthepass
        ))
        ->condition('uid', $user->uid)       
        ->execute();
    }
 }

еще одна возможность для Drupal 7:

$user = user_load($GLOBALS['user']->uid);
$user->pass = 'the new password';
user_save((object) array('uid' => $user->uid), (array) $user);

это автоматически хэширует пароль, без необходимости записи непосредственно в базу данных.


вот еще один более сложный подход Drupal 7, основанный на данном $username. Он также поддерживает адреса электронной почты, используемые в качестве имени пользователя.

$users = user_load_multiple(array(), array('mail' => $username, 'status' => '1'));
$account = reset($users);
if (!$account) {
  // No success, try to load by name.
  $users = user_load_multiple(array(), array('name' => $username, 'status' => '1'));
  $account = reset($users);
}

if ($account) {
  $account->pass = 'new password';
  user_save($account);
}
else {
  watchdog('user', 'Cannot load user: %user', array('%user' => $username), array(), WATCHDOG_ERROR);
}

здесь уже много хороших ответов, но я думаю, что добавлю тот, который я нашел легким для меня.

// ID of the user whose password you wish to change.
$uid = 1;

// Load the user account.
$account = user_load($uid);

// Load hashing libraries.
// You can use module_load_include() if you want to make it cleaner.
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');

// Generate new password hash.
$password_hash = user_hash_password('enter-new-password-here');
if (!$password_hash) {
  // Password could not be hashed. Handle the error.
  exit('Password could not be hashed.');
}

$account->pass = $password_hash;
user_save($account);

учитывая, что все настроено правильно, пароль вашего пользователя будет обновлен.

Примечание: если вы забыли свой пароль, вы можете проигнорировать обработка ошибок и т. д. Добавьте эти строки в .в PHP до menu_execute_active_handler (); и откройте любую страницу, чтобы сбросить пароль. Не забудь удалите линии после того, как вы закончите!