Passwords FOSUserBundle:自定义密码/从旧数据库结构迁移

Passwords FOSUserBundle:自定义密码/从旧数据库结构迁移,passwords,symfony,md5,database-migration,fosuserbundle,Passwords,Symfony,Md5,Database Migration,Fosuserbundle,我想搬到Symfony2,因为它的现代性和良好的编程给我留下了深刻的印象 现在我从我的旧系统中获取一个用户表,有10000个用户,我不想让他们设置新密码来激怒他们……所以我希望他们能够使用旧密码登录 以下是my users表的伪代码,其中有3个主要的登录/注册字段: id, int(10) unsigned NOT NULL username varchar(40) NOT NULL passhash varchar(32) NOT NULL secret varchar(20) NOT NUL

我想搬到Symfony2,因为它的现代性和良好的编程给我留下了深刻的印象

现在我从我的旧系统中获取一个用户表,有10000个用户,我不想让他们设置新密码来激怒他们……所以我希望他们能够使用旧密码登录

以下是my users表的伪代码,其中有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中最好地处理它,而不必编辑太多文件呢

使用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);
}

您需要创建自定义密码编码器:

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

只要
User::getSalt()
返回
secret
User::getPassword()
返回
passhash
,您就可以开始了。

您可以使用
plainPassword
字段设置它,它将由FOSUserBundle或您自己的安全编码器进行编码。只有在使用纯文本密码开始时,这才有效。如果你从一个编码的密码开始,你将有一个双重编码。谢谢克里斯,解释得很好。但是我应该把我的密码编码器粘贴到哪里呢?你可以把这个类放在你的一个包中。aight会把它放在Security\encoder\MyPasswordEncoder.php下
services:
    my_password_encoder:
        class: MyPasswordEncoder

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