ฉันจะย้ายรหัสผ่านผู้ใช้จาก Drupal 6 ไปยัง Drupal 7 ได้อย่างไร


20

ฉันพยายามโยกย้ายผู้ใช้จาก Drupal 6 ไปยังเว็บไซต์ Drupal 7 ปัญหาของฉันคือวิธีเปลี่ยนรหัสผ่านจาก MD5 เป็นรหัสแฮช (ใช้โดย D7)
คุณมีความคิดใด ๆ

คำตอบ:


11

ในการอัปเดตรหัสผ่าน md5 ไปเป็นรหัสที่ถูกแฮชฉันจำเป็นต้องใช้user_hash_password ()และเชื่อมต่อกับ 'U' นี่คือสคริปต์ที่ฉันเคยทำให้มันใช้งานได้

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

จากนั้นฉันก็วิ่ง

drush scr <name_of_the_script_file>

และมันก็ใช้งานได้


11 เมื่อการวนซ้ำนับเป็นสิ่งมาตรฐาน D6 หรือไม่
Sam152


5

หากใครต้องการสคริปต์ PHP แบบสแตนด์อโลนเพื่อย้ายผู้ใช้จาก Drupal 6 ไปเป็น Drupal 7 แสดงว่ามันคือ:

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

    }
    ?>

คุณช่วยกรุณาพูดถึงตำแหน่งที่ควรวางไว้ได้ไหม?
Rootical V.

1
@Rootical V คุณสามารถเรียกใช้สคริปต์นี้จากตำแหน่งใด ๆ ผ่านทางบรรทัดคำสั่งเนื่องจากคุณใส่เส้นทางที่ถูกต้องและข้อมูลประจำตัวของฐานข้อมูลในสคริปต์
Ajinkya Kulkarni

2

ดีถ้าคุณอัพเกรดคุณออกมาพร้อมกับรหัสผ่านของคุณตกลง ฉันเดาว่าคุณอาจจะดูที่รหัสการอัปเกรดเพื่อดูว่าพวกเขาทำได้อย่างไร

อย่างไรก็ตามหากคุณเพิ่งย้ายผู้ใช้วิธีที่น่าจะเป็นไปได้มากที่สุดก็คือเพียงแค่ส่งลิงก์เข้าสู่ระบบแบบครั้งเดียวให้กับทุกคนและให้พวกเขารีเซ็ตรหัสผ่าน


ฉันเพิ่งสังเกตเห็นว่าdrupal.org/project/login_one_timeทำงานร่วมกับ views_bulk_operations ดังนั้นหากคุณจะใช้รหัสผ่านไม่ถูกต้องนี่จะเป็นวิธีที่ยอดเยี่ยมในการสร้างรหัสผ่านใหม่
rfay

0

ถ้าฉันใช้สิ่งนี้จาก devel / php บนเว็บไซต์ D7 ฉันพบว่าฉันต้องการเพียง:

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

}

ทั้งสองเว็บไซต์อยู่บนเว็บเซิร์ฟเวอร์เดียวกัน


คุณเลือกที่จะเปลี่ยนรหัสผ่านด้วยตนเอง นอกจากนี้ยังสามารถทำได้โดยโมดูลการโยกย้ายโดยใช้$this->destination = new MigrateDestinationUser(array('md5_passwords' => TRUE)); ... $this->addFieldMapping('pass', 'source_password');
Neograph734
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.