2011-06-01 19 views
7

पर मुझे उपयोगकर्ताओं के अलावा अन्य डी 7 निर्माण में किसी भी डेटा को आयात करने की ज़रूरत नहीं है। मेरे पास (एसक्यूएल द्वारा) मेरे उपयोगकर्ता डेटा आयात किया गया है, हालांकि, डी 7 पासवर्ड एन्क्रिप्शन विधि अब अलग है।Drupal 6 उपयोगकर्ता पासवर्ड आयात Drupal 7

मैं कल्पना के किसी भी खिंचाव से एक विशेषज्ञ नहीं हूँ और मैं Drush उपयोग नहीं किया है, लेकिन मैं भर में इस user_update_7000 कोड स्निपेट user.install पाया (http://api.drupal.org/api/drupal/modules--user--user.install/function/user_update_7000/7)

<?php 
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc'); 
$old_hash = md5('password'); 
$hash_count_log2 = 11; 

$new_hash = user_hash_password($old_hash, $hash_count_log2); 

if ($new_hash) { 
    // Indicate an updated password. 
    $new_hash = 'U' . $new_hash; 
} 
?> 

मैं कहां से कर सकते थे आ गए हैं मेरे डीबी में पासवर्ड फ़ील्ड अपडेट करने के लिए इस स्क्रिप्ट को चलाएं?

धन्यवाद,

स्टीव

उत्तर

8

मुझे लगता है कि आप rehash.php की तरह एक पेज नामित कुछ (अपने जड़ में, update.php के रूप में एक ही जगह) बना सकते हैं। फिर, व्यवस्थापक के रूप में पहले लॉग इन करें, इस पृष्ठ को दूसरी बार ब्राउज़ करें। नीचे दिए गए कोड को देखें (अधिकांश उपयोगकर्ता ड्रूपल 7 इंस्टॉल में user_update_7200 से लिया गया है) ...

खराब मामला, आप एक साधारण कस्टम मॉड्यूल बना सकते हैं और इस कोड को वहां डाल सकते हैं।

कृपया ध्यान दें कि आप चीजों का बैकअप लेने चाहिए कि पहले:

<?php 
    // bootstrap stuff 
    define('DRUPAL_ROOT', getcwd()); 

    include_once DRUPAL_ROOT . '/includes/bootstrap.inc'; 
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 

    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc'); 

    // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed. 
    $hash_count_log2 = 11; 

    // Hash again all current hashed passwords. 
    $has_rows = FALSE; 

    // Update this many users 
    $count = 1000; 

    $result = db_query_range("SELECT uid, pass FROM {users} WHERE uid > 1 ORDER BY uid", 0, $count); 
    foreach ($result as $account) { 
     $has_rows = TRUE; 
     $new_hash = user_hash_password($account->pass, $hash_count_log2); 
     if ($new_hash) { 
     // Indicate an updated password. 
     $new_hash = 'U' . $new_hash; 
     db_update('users') 
      ->fields(array('pass' => $new_hash)) 
      ->condition('uid', $account->uid) 
      ->execute(); 
     } 
    } 
?> 
+1

पूरी तरह से काम किया, धन्यवाद! एक चीज जिसे मुझे संपादित करने की आवश्यकता थी, वह लाइन 1 9 पर एसक्यूएल था ... यदि कोई अन्य व्यक्ति इस यूआईडी का उपयोग करता है तो व्यवस्थापक पासवर्ड को पुनः टालने से बचने के लिए 1 से अधिक होना चाहिए। –

+1

अच्छा बिंदु =)। अपडेट किया गया। – hross

+0

मुझे लगता है कि आप user_update_7000 का मतलब है, user_update_7200 – aaronbauman

0

इस उत्तर सही था। मैंने इसे ड्रूपल 5 साइट से अपडेट करने के लिए इस्तेमाल किया। मैंने अपने उद्देश्यों के अनुरूप कुछ बदलाव किए:

  1. मैंने अपडेट किए गए पासवर्ड की संख्या सीमित नहीं की है। मैं चाहता था कि वे सभी अपडेट हो जाएं, और जिस सिस्टम को मैं अद्यतन कर रहा था, उसके पास 1,000 से अधिक उपयोगकर्ता थे।

  2. मैंने यह सुनिश्चित करने के लिए एक चेक जोड़ा कि मैं दो बार पासवर्ड अपडेट नहीं कर रहा था। इस तरह, यदि यह समय समाप्त हो जाता है (जैसा कि यह मेरे लिए किया गया है) सभी पासवर्ड संशोधित करने के लिए, मैं रूपांतरण को पूरा करने के लिए rehash.php को फिर से चालू कर सकता हूं। हालांकि, जागरूक रहें, कि जब उपयोगकर्ता लॉग इन करता है, तो पासवर्ड फिर से धोने पर अग्रणी "यू" हटा दिया जाता है।

    if (substr($account->pass, 0, 1) == 'U') 
    { 
        continue; 
    } 
    
0

मैं पर्याप्त अंक एक टिप्पणी जोड़ने की जरूरत नहीं है, लेकिन मैं कई शोधन कर दिया है 'hross का जवाब (और एक मसौदा नई जानकारी सबमिट)।

यहां दस्तावेज़ों के साथ एक बेहतर स्क्रिप्ट है और मैनुअल ड्रूपल 6 से 7 विलय करने वाले लोगों के लिए गैर-डिफ़ॉल्ट उपयोगकर्ता तालिका निर्दिष्ट करने की क्षमता है। इसमें जेपीबी की जांच भी शामिल है।

<?php 
    /** 
    * Use this script to update Drupal 6 users password hashes to Drupal 7 specs. 
    * 
    * Ensure you BACKUP YOUR USERS TABLE before using this script! If not your whole site! 
    * Name this file update_users.php and place in your Drupal root, same place as update.php 
    * 
    * - If you've manually inserted a new table into your database, change the $databasename below. 
    * - If this does not run, ensure you are logged into your site as admin. 
    * - If this does not run, check your drupal watchdog and/or PHP logs 
    * - If you see this error "PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'pass' at row 1:" 
    * you need to update your table's structure so that pass is a varchar(128). 
    * 
    * BACKUP, THIS MAY BREAK YOUR SITE AND EAT YOUR DATA! 
    */ 

    echo "Starting. \r\n"; 

    // Change this if you've made a custom table 
    $databasename = "users"; 

    // Update this many users 
    $count = 1000; 

    // bootstrap stuff 
    define('DRUPAL_ROOT', getcwd()); 

    include_once DRUPAL_ROOT . '/includes/bootstrap.inc'; 
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 

    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc'); 

    // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed. 
    $hash_count_log2 = 11; 

    // Hash again all current hashed passwords. 
    $has_rows = FALSE; 

    $result = db_query_range("SELECT uid, pass FROM {" . $databasename . "} WHERE uid > 10 ORDER BY uid", 0, $count); 
    foreach ($result as $account) { 
    $has_rows = TRUE; 
    if (substr($account->pass, 0, 1) != 'U') { 
     echo "updating account: " . $account->uid . " \r\n"; 
     $new_hash = user_hash_password($account->pass, $hash_count_log2); 
     if ($new_hash) { 
     // Indicate an updated password. 
     $new_hash = 'U' . $new_hash; 
     db_update($databasename) 
      ->fields(array('pass' => $new_hash)) 
      ->condition('uid', $account->uid) 
      ->execute(); 
     } 
    } 
    } 
    echo "Done."; 
?> 
+0

कृपया परिवर्तनीय $ डेटाबेसबेस को $ tablename में बदलें। यह थोड़ा उलझन में था। –

संबंधित मुद्दे