Bagaimana cara memigrasikan kata sandi pengguna dari Drupal 6 ke Drupal 7?

20

Saya mencoba memigrasikan pengguna dari situs Drupal 6 ke situs Drupal 7. Masalah saya adalah bagaimana mengubah kata sandi mereka dari MD5 menjadi hash (digunakan oleh D7).
Apakah kamu punya ide?

João Guilherme
sumber

Jawaban:

11

Untuk memperbarui kata sandi md5 ke kata hash, saya harus menggunakan user_hash_password () dan membuat huruf 'U'. Berikut ini skrip yang saya gunakan untuk membuatnya bekerja.

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

Lalu aku berlari

drush scr <name_of_the_script_file>

Dan itu berhasil.

João Guilherme
sumber
Apakah 11 sebagai iterasi menghitung standar D6?
Sam152
7

Ada jawaban yang SANGAT sederhana untuk ini:

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

Referensi: Mempertahankan kata sandi pengguna

laut26.2
sumber
5

Jika seseorang membutuhkan skrip PHP mandiri untuk memigrasikan pengguna dari Drupal 6 ke Drupal 7, maka ini dia:

  <?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
sumber
Bisakah Anda sebutkan di mana itu harus ditempatkan?
Rootical V.
1
@Rootical V, Anda dapat menjalankan skrip ini dari lokasi mana pun melalui baris perintah mengingat Anda meletakkan jalur yang benar dan kredensial basis data dalam skrip.
Ajinkya Kulkarni
2

Nah, jika Anda memutakhirkan Anda keluar dengan kata sandi Anda OK. Saya kira Anda mungkin bisa melihat kode peningkatan untuk melihat bagaimana mereka melakukannya.

Namun, jika Anda hanya memigrasikan pengguna, mungkin pendekatan yang paling mungkin adalah mengirim tautan masuk satu kali ke semua orang dan meminta mereka untuk mereset kata sandi mereka.

rfay
sumber
Saya baru saja memperhatikan bahwa drupal.org/project/login_one_time terintegrasi dengan views_bulk_operations, jadi jika Anda akan membatalkan kata sandi, ini akan menjadi cara yang bagus untuk membangun kembali mereka.
rfay
0

Jika saya menjalankan ini dari devel / php di situs D7, saya menemukan saya hanya perlu:

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

}

Kedua situs berada di server web yang sama.

mchaplin
sumber
Anda memilih untuk mengubah kata sandi secara manual. Ini juga dapat dilakukan oleh modul migrasi menggunakan$this->destination = new MigrateDestinationUser(array('md5_passwords' => TRUE)); ... $this->addFieldMapping('pass', 'source_password');
Neograph734