2012-01-07 129 views
5

我想转移到Symfony2,因为我对它的现代性和良好的编程印象深刻。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()回报secretUser::getPassword()返回passhash你应该很好去。

+0

感谢克里斯,很好地解释。但我在哪里粘贴我的密码编码器? – Confidence 2012-01-08 11:52:04

+0

您可以将该类放入其中一个包中。 – 2012-01-08 16:44:56

+1

aight,将它置于Security \ Encoder \ MyPasswordEncoder.php下 – Confidence 2012-01-08 21:54:47

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 2012-01-07 22:38:04

+0

您可以使用'plainPassword'字段设置它,它将由FOSUserBundle或您自己的安全编码器进行编码。 – 2012-01-08 08:01:00

+0

只有以纯文本密码开始时,这才起作用。 如果您从一个编码密码开始,您将有一个双重编码。 – elachance 2013-09-25 18:10:07

相关问题