Comment migrer les mots de passe des utilisateurs de Drupal 6 vers Drupal 7?

20

J'essaie de migrer les utilisateurs d'un Drupal 6 vers un site Drupal 7. Mon problème est de savoir comment changer leur mot de passe de MD5 à celui de hachage (utilisé par D7).
Avez-vous une idée?

João Guilherme
la source

Réponses:

11

Pour mettre à jour le mot de passe md5 vers celui haché, je devais utiliser user_hash_password () et concacter un «U». Voici le script que j'ai utilisé pour le faire fonctionner.

<?php
        require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
        $res = db_query('select * from drupal.users');

        if($res) {
                foreach ($res as $result) {
                        $hashed_pass = user_hash_password($result->pass, 11);
                        if ($hashed_pass) {
                          $hashed_pass  = 'U' . $hashed_pass;
                          db_update('users')->fields(array('pass' => $hashed_pass))->condition('uid', $result->uid)->execute();
                        }
                }
        }

Puis j'ai couru

drush scr <name_of_the_script_file>

Et ça a marché.

João Guilherme
la source
Est-ce que 11 comme le nombre d'itérations est une chose D6 standard?
Sam152
7

Il y a une réponse TRÈS simple à ceci:

<?php
  $this->destination = new MigrateDestinationUser(array('md5_passwords' => TRUE));
  ...
  $this->addFieldMapping('pass', 'source_password');
?>

Référence: conservation des mots de passe utilisateur

mer26.2
la source
5

Si quelqu'un a besoin d'un script PHP autonome pour migrer les utilisateurs de Drupal 6 vers Drupal 7, alors voici:

  <?php
    /*
    Standalone PHP script to migrate users from Drupal 6 to Drupal 7 programatically.
    Date: 9-4-2012
    */

    // set HTTP_HOST or drupal will refuse to bootstrap
    $_SERVER['HTTP_HOST'] = 'example.org';
    $_SERVER['REMOTE_ADDR'] = '127.0.0.1';


    //root of Drupal 7 site
    $DRUPAL7_ROOT="/var/www/ace";
    define('DRUPAL_ROOT',$DRUPAL7_ROOT);
    chdir($DRUPAL7_ROOT);
    require_once "./includes/bootstrap.inc";
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
    require_once "./includes/password.inc";

    //connect to Drupal 6 database
    //syntax:mysqli(hostname,username,password,databasename);
    $db= new mysqli('localhost','ace6','ace6','ace6');
    if(mysqli_connect_errno())  {
        echo "Conection error. Could not connect to Drupal 6 site!";
        exit;
    }

    //get users from Drupal 6 database
    $query="select * from users";
    $result=$db->query($query);
    //count number of users
    $num_results=$result->num_rows;
    for($i=0;$i<$num_results;$i++){

        //fetch each row/user
        $row=$result->fetch_assoc();

        //migrate only active users
        if($row['status']==1){

            //convert password from Drupal 6 style to Drupal 7 style
            $hashed_pass='U'.user_hash_password($row['pass'],11);

            //check if user with same email address already exists in Drupal 7 database, if it does, do not migrate
            if (!user_load_by_mail($row['mail'])) {
                $account = new stdClass;
                $account->is_new = TRUE;
                $account->name = $row['name'];
                $account->pass = $hashed_pass;
                $account->mail = $row['mail'];
                $account->init = $row['mail'];
                $account->status = TRUE;
                $account->roles = array(DRUPAL_AUTHENTICATED_RID => TRUE);
                $account->timezone = variable_get('date_default_timezone', '');
                //create user in Drupal 7 site 
                user_save($account);
                //print message
                echo "User acount ".$row['name']." has been created\n";
            }
        }

    }
    ?>
Ajinkya Kulkarni
la source
Pourriez-vous indiquer où il doit être placé?
Rootical V.
1
@Rootical V vous pouvez exécuter ce script à partir de n'importe quel emplacement via la ligne de commande étant donné que vous avez mis le chemin d'accès et les informations d'identification de base de données corrects dans le script.
Ajinkya Kulkarni
2

Eh bien, si vous mettez à niveau vous sortez avec vos mots de passe OK. Je suppose que vous pourriez probablement regarder le code de mise à niveau pour voir comment ils le font.

Cependant, si vous ne faites que migrer des utilisateurs, l'approche la plus probable serait probablement d'envoyer des liens de connexion uniques à tout le monde et de les inciter à réinitialiser leurs mots de passe.

rfay
la source
Je viens de remarquer que drupal.org/project/login_one_time s'intègre à views_bulk_operations, donc si vous allez invalider des mots de passe, ce serait un excellent moyen de les rétablir.
rfay
0

Si je l'ai exécuté depuis devel / php sur le site D7, j'ai trouvé que j'avais seulement besoin de:

require_once "./includes/password.inc";

//connect to Drupal 6 database
//syntax:mysqli(hostname,username,password,databasename);
$db= new mysqli('localhost','ace6','ace6','ace6');
if(mysqli_connect_errno())  {
    echo "Conection error. Could not connect to Drupal 6 site!";
    exit;
}

//get users from Drupal 6 database
$query="select * from users";
$result=$db->query($query);
//count number of users
$num_results=$result->num_rows;
for($i=0;$i<$num_results;$i++){

    //fetch each row/user
    $row=$result->fetch_assoc();

    //migrate only active users
    if($row['status']==1){

        //convert password from Drupal 6 style to Drupal 7 style
        $hashed_pass='U'.user_hash_password($row['pass'],11);

        //check if user with same email address already exists in Drupal 7 database, if it does, do not migrate
        if (!user_load_by_mail($row['mail'])) {
            $account = new stdClass;
            $account->is_new = TRUE;
            $account->name = $row['name'];
            $account->pass = $hashed_pass;
            $account->mail = $row['mail'];
            $account->init = $row['mail'];
            $account->status = TRUE;
            $account->roles = array(DRUPAL_AUTHENTICATED_RID => TRUE);
            $account->timezone = variable_get('date_default_timezone', '');
            //create user in Drupal 7 site 
            user_save($account);
            //print message
            echo "User acount ".$row['name']." has been created\n";
        }
    }

}

Les deux sites étaient sur le même serveur Web.

mchaplin
la source
Vous avez choisi de modifier manuellement le mot de passe. Cela peut également être fait par le module de migration en utilisant$this->destination = new MigrateDestinationUser(array('md5_passwords' => TRUE)); ... $this->addFieldMapping('pass', 'source_password');
Neograph734