2012-01-07 17 views
5

Voglio passare a Symfony2, perché sono totalmente impressionato dalla sua modernità e dalla buona programmazione.FOSUserBundle: password personalizzata/migrazione dalla vecchia struttura DB

Ora sto prendendo una tabella utenti dal mio vecchio sistema, con 10.000 utenti, e non voglio farli arrabbiare facendoli impostare una nuova password .... quindi voglio che siano in grado di accedere con la loro vecchia password

Ecco pseudo-codice di come la mia tabella di utenti sembra con 3 principali settori riguardanti login/registrazione:

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

su iscrizione, i dati vengono generati in questo modo:

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

su login, i dati vengono controllati nel seguente modo:

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

così come faccio a gestire la cosa migliore in FOSUserBundle, senza dover modificare troppi file?

risposta

11

È necessario creare un codificatore password personalizzata:

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

e configurarlo in security.yml:

services: 
    my_password_encoder: 
     class: MyPasswordEncoder 

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

Finché User::getSalt() rendimenti secret e User::getPassword() restituisce passhash dovresti essere a posto.

+0

grazie Kris, molto ben spiegato. Ma dove incollo il mio codificatore di password? – Confidence

+0

Puoi mettere quella classe in uno dei tuoi pacchetti. –

+1

aight, lo inserirà in Security \ Encoder \ MyPasswordEncoder.php – Confidence

0

È molto facile da fare con FOSUserBundle. Questo è il codice per esso:

$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

grazie ma non lavoro con password semplice qui. – Confidence

+0

L'hai impostato usando il campo 'plainPassword', e sarà codificato da FOSUserBundle o dal tuo codificatore di sicurezza. –

+0

Funzionerà solo se inizi con una password in testo semplice. Se si inizia con una password codificata, si avrà una doppia codifica. – elachance

Problemi correlati