Импорт пароля пользователя Drupal 6 в Drupal 7 - PullRequest
7 голосов
/ 01 июня 2011

Мне не нужно импортировать какие-либо данные в мою сборку D7, кроме пользователей.Я (по SQL) импортировал свои пользовательские данные, однако, метод шифрования пароля D7 теперь другой.

Я не эксперт в любой области воображения, и я никогда не использовал Drush, но у меня естьнаткнулся на этот user_update_7000 фрагмент кода, найденный user.install (http://api.drupal.org/api/drupal/modules--user--user.install/function/user_update_7000/7)

<?php
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
$old_hash = md5('password');
$hash_count_log2 = 11;

$new_hash = user_hash_password($old_hash, $hash_count_log2);

if ($new_hash) {
  // Indicate an updated password.
  $new_hash  = 'U' . $new_hash;
}
?>

Где можно запустить этот скрипт для обновления поля пароля в моей БД?

Спасибо,

Стив

Ответы [ 3 ]

8 голосов
/ 01 июня 2011

Я думаю, вы можете создать страницу с именем что-то вроде rehash.php (в вашем корне, там же, где и update.php). Затем сначала войдите в систему как администратор, затем перейдите на эту страницу. См. Код ниже (большинство взято из user_update_7200 в последней установке drupal 7) ...

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

Обратите внимание, что вы должны сначала сделать резервную копию :

<?php
    // bootstrap stuff
    define('DRUPAL_ROOT', getcwd());

    include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');

    // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed.
    $hash_count_log2 = 11;

    //  Hash again all current hashed passwords.
    $has_rows = FALSE;

    // Update this many users
    $count = 1000;

    $result = db_query_range("SELECT uid, pass FROM {users} WHERE uid > 1 ORDER BY uid", 0, $count);
    foreach ($result as $account) {
      $has_rows = TRUE;
      $new_hash = user_hash_password($account->pass, $hash_count_log2);
      if ($new_hash) {
        // Indicate an updated password.
        $new_hash  = 'U' . $new_hash;
        db_update('users')
          ->fields(array('pass' => $new_hash))
          ->condition('uid', $account->uid)
          ->execute();
      }
    }
?>
0 голосов
/ 06 марта 2013

У меня недостаточно очков, чтобы добавить комментарий, но я внес несколько уточнений в ответ пользователя (и отправил черновик обновления).

Вот улучшенный скрипт с документацией и возможностью указать таблицу пользователей не по умолчанию для тех, кто выполняет слияние Drupal с 6 по 7. Он также включает проверку jpb.

<?php
  /**
   * Use this script to update Drupal 6 users password hashes to Drupal 7 specs.
   * 
   * Ensure you BACKUP YOUR USERS TABLE before using this script! If not your whole site! 
   * Name this file update_users.php and place in your Drupal root, same place as update.php
   *
   * - If you've manually inserted a new table into your database, change the $databasename below.
   * - If this does not run, ensure you are logged into your site as admin.
   * - If this does not run, check your drupal watchdog and/or PHP logs
   * - If you see this error "PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'pass' at row 1:"
   *   you need to update your table's structure so that pass is a varchar(128).
   *
   * BACKUP, THIS MAY BREAK YOUR SITE AND EAT YOUR DATA!
   */

  echo "Starting. \r\n";

  // Change this if you've made a custom table
  $databasename = "users";

  // Update this many users
  $count = 1000;

  // bootstrap stuff
  define('DRUPAL_ROOT', getcwd());

  include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

  require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');

  // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed.
  $hash_count_log2 = 11;

  //  Hash again all current hashed passwords.
  $has_rows = FALSE;

  $result = db_query_range("SELECT uid, pass FROM {" . $databasename . "} WHERE uid > 10 ORDER BY uid", 0, $count);
  foreach ($result as $account) {
    $has_rows = TRUE;
    if (substr($account->pass, 0, 1) != 'U') {
      echo "updating account: " . $account->uid . " \r\n";
      $new_hash = user_hash_password($account->pass, $hash_count_log2);
      if ($new_hash) {
        // Indicate an updated password.
        $new_hash  = 'U' . $new_hash;
        db_update($databasename)
          ->fields(array('pass' => $new_hash))
          ->condition('uid', $account->uid)
          ->execute();
      }
    }
  }
  echo "Done.";
?>
0 голосов
/ 16 августа 2011

Этот ответ был идеальным. Я использовал его для обновления с сайта Drupal 5. Я сделал несколько изменений в соответствии с моими целями:

  1. Я не ограничивал количество паролей, которые обновляются. Я хотел, чтобы все они были обновлены, и система, которую я обновлял, имела более 1000 пользователей.

  2. Я добавил проверку, чтобы убедиться, что я не обновлял пароль дважды. Таким образом, если время для всех паролей истечет (как и для меня), я могу перезапустить файл rehash.php, чтобы завершить преобразование. Имейте в виду, однако, что когда пользователь входит в систему, ведущая буква «U» удаляется при повторном хешировании пароля.

    if (substr($account->pass, 0, 1) == 'U')
    {
        continue;
    }
    
...