Wie migriere ich Benutzerpasswörter von Drupal 6 auf Drupal 7?

20

Ich versuche, Benutzer von einer Drupal 6-Site auf eine Drupal 7-Site zu migrieren. Mein Problem ist, wie man sein Passwort von MD5 auf das Hash-Passwort (von D7 verwendet) ändert.
Hast du irgendeine Idee?

João Guilherme
quelle

Antworten:

11

Um das MD5-Passwort auf das Hash-Passwort zu aktualisieren, musste ich user_hash_password () verwenden und ein 'U' setzen. Hier ist das Skript, mit dem ich es erstellt habe.

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

Dann rannte ich

drush scr <name_of_the_script_file>

Und es hat funktioniert.

João Guilherme
quelle
Ist 11 als Iterationszahl eine Standard-D6-Sache?
Sam152
7

Darauf gibt es eine sehr einfache Antwort:

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

Referenz: Benutzerkennwörter beibehalten

sea26.2
quelle
5

Wenn jemand ein eigenständiges PHP-Skript benötigt, um Benutzer von Drupal 6 auf Drupal 7 zu migrieren, dann ist dies hier:

  <?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
quelle
Könnten Sie bitte erwähnen, wo es platziert werden soll?
Rootical V.
1
@Rootical V Sie können dieses Skript von jedem Ort über die Befehlszeile ausführen, vorausgesetzt, Sie haben die richtigen Pfad- und Datenbankanmeldeinformationen in das Skript eingegeben.
Ajinkya Kulkarni
2

Na wenn du Upgrade durchführen, geben Sie Ihre Passwörter ein. Sie könnten sich wahrscheinlich den Upgrade-Code ansehen, um zu sehen, wie sie das tun.

Wenn Sie jedoch nur Benutzer migrieren, besteht der wahrscheinlichste Ansatz darin, nur einmalige Anmeldelinks an alle Benutzer zu senden und diese zum Zurücksetzen ihrer Kennwörter zu bewegen.

rfay
quelle
Mir ist gerade aufgefallen, dass drupal.org/project/login_one_time in views_bulk_operations integriert ist. Wenn Sie also Passwörter ungültig machen, ist dies eine großartige Möglichkeit, sie wiederherzustellen.
Rfay
0

Wenn ich dies von devel / php auf der D7-Site ausgeführt habe, habe ich festgestellt, dass ich nur Folgendes brauchte:

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

}

Beide Sites befanden sich auf demselben Webserver.

mchaplin
quelle
Sie haben das Passwort manuell geändert. $this->destination = new MigrateDestinationUser(array('md5_passwords' => TRUE)); ... $this->addFieldMapping('pass', 'source_password');
Dies