Làm cách nào để tôi di chuyển mật khẩu người dùng từ Drupal 6 sang Drupal 7?


20

Tôi đang cố gắng di chuyển người dùng từ trang web Drupal 6 sang trang web Drupal 7. Vấn đề của tôi là làm thế nào để thay đổi mật khẩu của họ từ MD5 sang hàm băm (được sử dụng bởi D7).
Bạn còn ý kiến ​​nào không?

Câu trả lời:


11

Để cập nhật mật khẩu md5 thành mật khẩu được băm, tôi cần sử dụng user_hash_password () và ký hiệu 'U'. Đây là kịch bản mà tôi đã sử dụng để làm cho nó hoạt động.

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

Sau đó tôi chạy

drush scr <name_of_the_script_file>

Va no đa hoạt động.


Là 11 khi số lần lặp là một điều D6 tiêu chuẩn?
Sam52

7

Có một câu trả lời RẤT đơn giản cho điều này:

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

Tham khảo: Giữ mật khẩu người dùng


5

Nếu ai đó cần một tập lệnh PHP độc lập để di chuyển người dùng từ Drupal 6 sang Drupal 7, thì đây là:

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

    }
    ?>

Bạn có thể vui lòng đề cập đến nơi nó nên được đặt?
Rootical V.

1
@Rootical V bạn có thể chạy tập lệnh này từ bất kỳ vị trí nào thông qua dòng lệnh được cung cấp rằng bạn đặt thông tin xác thực đường dẫn và cơ sở dữ liệu chính xác trong tập lệnh.
Ajinkya Kulkarni

2

Vâng, nếu bạn nâng cấp, bạn đi ra với mật khẩu của bạn OK. Tôi đoán bạn có thể có thể nhìn vào mã nâng cấp để xem cách họ làm điều đó.

Tuy nhiên, nếu bạn chỉ di chuyển người dùng, có lẽ cách tiếp cận rất có thể sẽ chỉ là gửi liên kết đăng nhập một lần cho mọi người và khiến họ đặt lại mật khẩu.


Tôi chỉ nhận thấy rằng drupal.org/project/login_one_time tích hợp với lượt xem_bulk_operations, vì vậy nếu bạn định vô hiệu hóa mật khẩu, đây sẽ là một cách tuyệt vời để thiết lập lại chúng.
rfay

0

Nếu tôi chạy cái này từ devel / php trên trang D7, tôi thấy tôi chỉ cần:

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

}

Cả hai trang web đều trên cùng một máy chủ web.


Bạn đã chọn tự thay đổi mật khẩu. Nó cũng có thể được thực hiện bởi mô-đun di chuyển bằng cách sử dụng$this->destination = new MigrateDestinationUser(array('md5_passwords' => TRUE)); ... $this->addFieldMapping('pass', 'source_password');
Neograph734
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.