2012-01-07 11 views
5

मैं सिम्फनी 2 पर जाना चाहता हूं, क्योंकि मैं इसकी आधुनिकता और अच्छे प्रोग्रामिंग से पूरी तरह से प्रभावित हूं।FOSUserBundle: पुराने पासवर्ड/पुराने डीबी संरचना से माइग्रेशन

अब मैं 10,000 उपयोगकर्ताओं के साथ अपने पुराने सिस्टम से उपयोगकर्ता तालिका ले रहा हूं, और मैं उन्हें एक नया पासवर्ड सेट करके क्रोधित नहीं करना चाहता .... इसलिए मैं उन्हें लॉगिन करने में सक्षम होना चाहता हूं अपने पुराने पासवर्ड

यहाँ कैसे मेरे उपयोगकर्ताओं की मेज के साथ 3 प्रमुख क्षेत्रों के विषय में प्रवेश करें/साइन अप जैसा लग रहा है की छद्म कोड है:

:

id, int(10) unsigned NOT NULL 
username varchar(40) NOT NULL 
passhash varchar(32) NOT NULL 
secret varchar(20) NOT NULL 

पर साइनअप, डेटा इस तरह से उत्पन्न हो जाता है

$secret = mksecret(); 
$passhash = md5 ($secret . $password_formfield . $secret); 

लॉगिन पर, डेटा निम्नलिखित तरीके से जाँच की जाती है:

if ($row['passhash'] != md5 ($row['secret'] . $password_formfield . $row['secret'])) 
{ 
//show login error 
} 

तो मैं FOSUserBundle में यह सबसे अच्छा कैसे संभाल करते हैं, भी कई फ़ाइलों को संपादित करने के बिना?

उत्तर

11

आप एक कस्टम पासवर्ड एनकोडर बनाने की जरूरत:

<?php 

use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder; 

class MyPasswordEncoder extends BasePasswordEncoder 
{ 
    public function encodePassword($raw, $salt) 
    { 
     return md5($salt.$raw.$salt); 
    } 

    public function isPasswordValid($encoded, $raw, $salt) 
    { 
     return $this->comparePasswords($encoded, $this->encodePassword($raw, $salt)); 
    } 
} 

और security.yml में कॉन्फ़िगर: यह इसके लिए कोड है

services: 
    my_password_encoder: 
     class: MyPasswordEncoder 

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: { id: my_password_encoder } 

जब तक User::getSalt() रिटर्न secret और User::getPassword()passhash देता है आपको जाने के लिए अच्छा होना चाहिए।

+0

धन्यवाद क्रिस, बहुत अच्छी तरह से समझाया। लेकिन मैं अपना पासवर्ड एन्कोडर कहां पेस्ट करूं? – Confidence

+0

आप उस वर्ग को अपने बंडलों में से एक में डाल सकते हैं। –

+1

एइट, इसे सुरक्षा \ एनकोडर \ MyPasswordEncoder.php के तहत रखेगा – Confidence

0

FOSUserBundle के साथ करना बहुत आसान है।

$userManager = $this->get('fos_user.user_manager'); 

foreach ($items as $item) { 
    $newItem = $userManager->createUser(); 

    //$newItem->setId($item->getObjId()); 
    // FOSUserBundle required fields 
    $newItem->setUsername($item->getUsername()); 
    $newItem->setEmail($item->getEmail()); 
    $newItem->setPlainPassword($item->getPassword()); // get original password 
    $newItem->setEnabled(true); 

    $userManager->updateUser($newItem, true); 
} 
+0

धन्यवाद लेकिन मैं यहां सादे पासवर्ड के साथ काम नहीं करता हूं। – Confidence

+0

आपने इसे 'plainPassword' फ़ील्ड का उपयोग करके सेट किया है, और इसे FOSUserBundle या अपने स्वयं के सुरक्षा एन्कोडर द्वारा एन्कोड किया जाएगा। –

+0

यह तभी काम करेगा जब आप एक सादे पाठ पासवर्ड से शुरू करते हैं। यदि आप एन्कोड किए गए पासवर्ड से शुरू करते हैं, तो आपके पास एक डबल एन्कोडिंग होगा। – elachance

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