2011-06-01 4 views
7

Je n'ai pas vraiment besoin d'importer des données dans ma version D7 autres que les utilisateurs. J'ai (par SQL) importé mes données d'utilisateur cependant, la méthode de cryptage de mot de passe D7 est maintenant différente.L'importation de mot de passe utilisateur Drupal 6 sur Drupal 7

Je ne suis pas un expert, loin de l'imagination et je ne l'ai jamais utilisé Drush, mais je suis venu à travers cet extrait de code user_update_7000 trouvé 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; 
} 
?> 

Où pourrais-je exécuter ce script afin de mettre à jour le champ mot de passe dans ma base de données?

Merci,

Steve

Répondre

8

Je pense que vous pouvez créer une page nommée quelque chose comme rehash.php (dans votre racine, même endroit que update.php). Ensuite, connectez-vous en tant qu'administrateur en premier, accédez à cette page en second lieu. Voir le code ci-dessous (le plus tiré de user_update_7200 dans la dernière installation de drupal 7) ...

Pire, vous pouvez créer un module personnalisé simple et mettre ce code là-dedans.

S'il vous plaît noter que vous devez sauvegarder les choses d'abord:

<?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(); 
     } 
    } 
?> 
+1

A travaillé parfaitement, merci! Une chose que j'avais besoin de modifier était le SQL sur la ligne 19 ... Si quelqu'un d'autre utilise cet UID devrait être supérieur à 1 pour éviter de ressasser le mot de passe administrateur. –

+1

Bon point =). Actualisé. – hross

+0

Je pense que vous vouliez dire user_update_7000, pas user_update_7200 – aaronbauman

0

Cette réponse était parfaite. Je l'ai utilisé pour mettre à jour à partir d'un site Drupal 5. J'ai fait quelques changements pour répondre à mes besoins:

  1. Je ne limite pas le nombre de mots de passe qui sont mis à jour. Je voulais tous les mettre à jour, et le système que je mettais à jour comptait plus de 1 000 utilisateurs.

  2. J'ai ajouté une vérification pour m'assurer que je ne mettais pas à jour un mot de passe deux fois. De cette façon, si le délai est dépassé (comme cela a été le cas pour moi) en modifiant tous les mots de passe, je peux réexécuter le fichier rehash.php pour terminer la conversion. Sachez cependant qu'une fois qu'un utilisateur se connecte, le «U» principal est supprimé lorsque le mot de passe est refait.

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

Je n'ai pas assez de points pour ajouter un commentaire, mais je l'ai fait plusieurs améliorations hross' réponse (et a présenté un projet mise à jour).

Voici un script amélioré avec de la documentation et la possibilité de spécifier une table d'utilisateurs non-par défaut pour ceux qui effectuent manuellement des fusions Drupal 6 à 7. Il intègre également la vérification de 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

Veuillez modifier la variable $ nom_basededonnées en $ nom_table. C'était un peu déroutant. –

Questions connexes