2012-01-07 28 views
5

Symfony2'ye geçmek istiyorum çünkü modernliğinden ve iyi programlarından çok etkilendim.FOSUserBundle: Özel parola/Eski DB yapısından geçiş

Şimdi eski sistemimden 10.000 kullanıcıyla bir kullanıcı tablosu alıyorum ve onları yeni bir parola ayarlayarak onları kızdırmak istemiyorum .... bu yüzden giriş yapabilmelerini istiyorum eski şifre

İşte

kullanıcılarımın tablo 3 büyük alanlar ilişkin giriş/kayıt işleminde nasıl göründüğünü sözde kod şudur:

:

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

kayıtüzerine, veri bu şekilde oluşturulan alır

$secret = mksecret(); $passhash = md5 ($secret . $password_formfield . $secret); 
çok fazla dosya düzenlemek zorunda kalmadan,
if ($row['passhash'] != md5 ($row['secret'] . $password_formfield . $row['secret'])) 
{ 
//show login error 
} 

Peki nasıl FOSUserBundle içinde en iyi yapmalıyım: login üzerinde

, veriler aşağıdaki şekilde kontrol alır?

cevap

11

: Bu onun için kodudur

services: 
    my_password_encoder: 
     class: MyPasswordEncoder 

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

Sürece User::getSalt() döner secret ve User::getPassword(), passhash değerini döndürür.

+0

teşekkürler Kris, çok iyi açıkladı. Ama şifre kodlayıcımı nereye yapıştırırım? – Confidence

+0

Bu sınıfı paketlerinizden birine koyabilirsiniz. –

+1

aight, Güvenlik \ Encoder \ MyPasswordEncoder.php altına koyacaktır. – Confidence

0

FOSUserBundle ile çok kolaydır.

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

Ve security.yml bunu yapılandırın:: Özel bir şifre kodlayıcı oluşturmak için gereken

$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

Teşekkürler ama burada düz bir şifre ile çalışmıyor. – Confidence

+0

"plainPassword" alanını kullanarak ayarlayın ve FOSUserBundle veya kendi güvenlik kodlayıcınız tarafından kodlanacaktır. –

+0

Bu, yalnızca düz metin parolası ile başladığınızda çalışır. Kodlanmış bir parola ile başlarsanız, çift kodlamanız olacaktır. – elachance