¿Cómo migro las contraseñas de los usuarios de Drupal 6 a Drupal 7?

20

Estoy tratando de migrar usuarios de un sitio Drupal 6 a un sitio Drupal 7. Mi problema es cómo cambiar su contraseña de MD5 a la hash (utilizada por D7).
¿Tienes alguna idea?

João Guilherme
fuente

Respuestas:

11

Para actualizar la contraseña de md5 al hash, necesitaba usar user_hash_password () y conectar una 'U'. Aquí está el guión que solía hacer que funcione.

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

Entonces corrí

drush scr <name_of_the_script_file>

Y funcionó.

João Guilherme
fuente
¿Es 11 como la iteración cuenta una cosa D6 estándar?
Sam152
7

Hay una respuesta MUY simple a esto:

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

Referencia: preservar contraseñas de usuario

mar26.2
fuente
5

Si alguien necesita un script PHP independiente para migrar usuarios de Drupal 6 a Drupal 7, entonces aquí está:

  <?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
fuente
¿Podría mencionar dónde debe colocarse?
Rootical V.
1
@Rootical V puede ejecutar esta secuencia de comandos desde cualquier ubicación a través de la línea de comandos dado que coloca la ruta correcta y las credenciales de la base de datos en la secuencia de comandos.
Ajinkya Kulkarni
2

Bueno, si actualizas saldrás con tus contraseñas OK. Supongo que probablemente podrías mirar el código de actualización para ver cómo lo hacen.

Sin embargo, si solo está migrando usuarios, probablemente el enfoque más probable sería enviar enlaces de inicio de sesión únicos a todos y hacer que restablezcan sus contraseñas.

rfay
fuente
Acabo de notar que drupal.org/project/login_one_time se integra con views_bulk_operations, por lo que si va a invalidar las contraseñas, esta sería una excelente manera de restablecerlas.
rfay
0

Si ejecuté esto desde devel / php en el sitio D7, descubrí que solo necesitaba:

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";
        }
    }

}

Ambos sitios estaban en el mismo servidor web.

mchaplin
fuente
Decidió modificar manualmente la contraseña. También se puede hacer mediante el módulo de migración usando$this->destination = new MigrateDestinationUser(array('md5_passwords' => TRUE)); ... $this->addFieldMapping('pass', 'source_password');
Neograph734