Перенос паролей пользователей с Drupal 6 на Drupal 7

Столкнулся с проблемой того, что в Drupal 6 пароли пользователей хранятся в md5 хеше, а в Drupal 7 уже в формате sha512. Причем хеш на то и хеш, чтобы из него было невозможно получить исходный пароль, т.е. невозможно сделать преобразование md5 -> исходный пароль -> шифрование в sha512
Что же делать? В Друпале все уже сделали за нас :)
Вот рабочий код:

 
  // ---> for password 
  // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed.
  $hash_count_log2 = 11;
  // 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');
  // <----- for password 
 $account = new stdClass;
    $account->is_new = TRUE;
    $account->name = 'foo';
    $account->pass = 'U' . user_hash_password($old_password_md5_hash, $hash_count_log2);
    $account->mail = 'foo@example.com';
    $account->init = 'foo@example.com';
    $account->status = TRUE;
    $account->roles = array(DRUPAL_AUTHENTICATED_RID => TRUE);
    $account->timezone = variable_get('date_default_timezone', '');
    $account->field_uid_samaya_old['und'][0]['value'] = 10;
    user_save($account);

Оказывается если добавить букву U в начало хеша пароля в Drupal 7, то при попытке пользователя залогиниться под этим логином друпал будет автоматически пытаться преобразовать введенный пользователем пароль сначала в md5, затем в sha512, затем сравнивать с тем, что есть в нашей базе без буквы U в начале; если все совпадает, то друпал берет тогда введенный пользователем пароль и генерирует из него уже нормальный хеш без буквы U в начале.

Drupal 6, 7

Комментарии

Nikita Petrov 19.05.2012 - 13:21

На самом деле, если вы просто обнвляете свой сайт с Drupal 6 на Drupal 7 стандартными методами самой системы (процедура описана здесь: http://drupal.org/documentation/upgrade/6/7)
то друпал сделает то же самое сам, самостоятельно. Но если вам, как в данном случае и мне, приходится переносить пользователей с одного сайта Drupal 6 на другой Drupal 7, то это метод как раз и нужен, его надо вставлять в свой самописный модуль (пример создания модуля http://trish.in/sozdanie-modulya-drupal), к тому же сам по себе код мало что значит - вам надо будет написать функцию получения всех аккаунтов сайта Drupal 6, и уже потом в цикле запускать приведенный в статье код для каждого аккаунта. Боюсь что раз вы спрашиваете такой вопрос, то это для вас будет слишком сложно, но все же разобраться вы сможете - у меня, к сожалению, нет времени чтобы написать более развёрнутую статью.

Добавить комментарий